我应该在查询中使用IQueryable列表而不是实体吗?

时间:2012-12-18 10:57:51

标签: c# entity-framework

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

  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创建的。

那么,你怎么看待这种方式?我应该使用这种吗? 如果你问为什么要使用它,我认为我不会这么多地查询我的数据库,也许更好?

1 个答案:

答案 0 :(得分:3)

  

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

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

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

... 对数据库执行查询,然后保留结果,因为我相信您期望它。相反,它有效地构建了一个查询 - 但保留查询以供日后使用。

如果您将其更改为:

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

然后只打了一次数据库 - 当然,如果数据库发生变化,你会得到过时的数据。也许这没关系 - 目前还不清楚EntityHelper的生命周期是什么 - 但对我来说似乎不太可能。请注意,对ToList的调用也会从数据库中获取所有成员 - 否则您的查询将具有适当的Where子句,从而限制所获取的内容。您可能不希望将整个表提取到内存中,除非它真的很小。