我编写了一个实体助手类,通常我会使用类似的东西
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创建的。
那么,你怎么看待这种方式?我应该使用这种吗? 如果你问为什么要使用它,我认为我不会这么多地查询我的数据库,也许更好?
答案 0 :(得分:3)
我应该使用某种吗?如果你问为什么要使用它,我认为我没有那么多查询我的数据库,也许更好?
不,您在数据库上的工作量完全相同。这样:
membersDb = db.Members.Select(s => s);
... 不对数据库执行查询,然后保留结果,因为我相信您期望它。相反,它有效地构建了一个查询 - 但保留查询以供日后使用。
如果您将其更改为:
IEnumerable<Members> membersDb;
...
membersDb = db.Members.ToList();
然后将只打了一次数据库 - 当然,如果数据库发生变化,你会得到过时的数据。也许这没关系 - 目前还不清楚EntityHelper
的生命周期是什么 - 但对我来说似乎不太可能。请注意,对ToList
的调用也会从数据库中获取所有成员 - 否则您的查询将具有适当的Where
子句,从而限制所获取的内容。您可能不希望将整个表提取到内存中,除非它真的很小。