Linq to sql 鉴于LINQ to实体不支持;“自定义方法”;如何保持干燥?
我遇到了这个问题: 基本上我有一些复杂的LINQ查询,所以我想把它们分解成子查询,这些子查询被实现为返回iQueryTables的方法。我希望这些IQueryables可以在一个LINQ语句中组合在一起(我很确定您可以在LINQtoSQL中这样做) 问题是,如果您尝试此方法,您会得到(例如): LINQ to实体无法识别 方法 'System.Linq.IQueryable'1[线程] GetThreadsByMstreccentlyPosted(Int32)' 方法,并且此方法不能为空 翻译成商店表达式 在我看来,如果您使用LINQ ORM,那么您需要能够组合LINQ查询,这是非常基本的。否则,必须复制并粘贴任何公共查询逻辑Linq to sql 鉴于LINQ to实体不支持;“自定义方法”;如何保持干燥?,linq-to-sql,entity-framework,linq-to-entities,Linq To Sql,Entity Framework,Linq To Entities,我遇到了这个问题: 基本上我有一些复杂的LINQ查询,所以我想把它们分解成子查询,这些子查询被实现为返回iQueryTables的方法。我希望这些IQueryables可以在一个LINQ语句中组合在一起(我很确定您可以在LINQtoSQL中这样做) 问题是,如果您尝试此方法,您会得到(例如): LINQ to实体无法识别 方法 'System.Linq.IQueryable'1[线程] GetThreadsByMstreccentlyPosted(Int32)' 方法,并且此方法不能为空 翻译
考虑到这个限制,使用LINQ to实体如何保持干爽?EF不能用包含方法的LINQ表达式组成查询。EF需要文字值来组成SQL 您必须处理返回给定案例所需实体超集的“公共”查询,然后使用扩展方法和LINQ缩小从数据库返回的返回集 两种方式:
public Expression<Func<Foo, bool>> WhereCreatorIsAdministrator()
{
return f => f.Creator.UserName.Equals("Administrator", StringComparison.OrdinalIgnoreCase);
}
public void DoStuff()
{
var exp = WhereCreatorIsAdministrator();
using (var c = new MyEntities())
{
var q = c.Foos.Where(exp); // supported in L2E
// do stuff
}
}
这可能效率较低,也可能没问题。这取决于你在做什么。它通常适用于投影,但通常不适用于限制
更新刚从Damien Guard看到。所以你真正想知道的是“我如何在EF中执行延迟执行,就像在L2S中一样?”。到目前为止,我能看到的唯一方法是将IQueryable转换为IEnumerable,在这一点上,我怀疑您失去了生成最佳SQL语句的能力否-与延迟执行无关。基本上,它不会让我写包含方法的linq语句。当你说“公共查询”时,你是指IEnumerables吗?e、 g.具有结果集而不是IQueryable的东西?我所说的“公共查询”是指可用于返回所需实体的可管理大小的超集的参数化查询。您设计的查询将取决于您的数据以及您拥有的数据量。我明白了。但这意味着内存连接等?我更喜欢选项一。因为我有一些非常复杂的LINQ表达式,很难维护。必须做点什么。
var partialFilter = from p in ctx.People
where p.Address.City == “Sammamish”
select p;
var possibleBuyers = from p in partiallyFilter.AsEnumerable()
where InMarketForAHouse(p);
select p;