1

我编写了一个实体助手类,通常我使用类似的东西

  private CVSystemEntities db;

public EntityHelper()
    {

        db = new CVSystemEntities();
   }

   public IQueryable<Members> GetMembersForRole(Role role)
    {
        if (!RoleExists(role))
            throw new ArgumentException(MissingRole);

        return db.Members.Where(m => m.RoleID == role.Id).OrderBy(m=>m.Name).AsQueryable();
    }

没关系,但如果我使用类似的东西

  private CVSystemEntities db;
  private IQueryable<Members> membersDb;


public EntityHelper()
    {

        db = new CVSystemEntities();
        membersDb = db.Members.Select(s => s);
   }

   public IQueryable<Members> GetMembersForRole(Role role)
    {
        if (!RoleExists(role))
            throw new ArgumentException(MissingRole);

        return membersDb.Where(m => m.RoleID == role.Id).OrderBy(m=>m.Name).AsQueryable();
    }

我使用了 membersClass 而不是 db.members。我从 db.members 创建了一个。

那么,您如何看待这种方式?我应该使用某种这种吗?如果你问为什么要使用它,我认为我没有查询我的数据库,也许更好?

4

1 回答 1

3

我应该使用某种这种吗?如果你问为什么要使用它,我认为我不查询我的数据库,也许更好?

不,您在数据库上做的工作量完全相同。这:

membersDb = db.Members.Select(s => s);

...不会在数据库上执行查询然后保留结果,我相信您会这样。相反,它有效地构建了一个查询 - 但保留该查询以备后用。

如果您将其更改为:

IEnumerable<Members> membersDb;
...
membersDb = db.Members.ToList();

那么这只会访问数据库一次 - 但当然,如果数据库发生更改,您将获得陈旧的数据。也许没关系——目前还不清楚你的寿命是多少EntityHelper——但对我来说似乎不太可能。请注意,调用ToList也会从数据库中获取所有成员 - 否则您的查询将具有适当Where的子句,从而限制获取的内容。您可能不想将整个表提取到内存中,除非它真的很小。

于 2012-12-18T11:07:25.017 回答