如何对T的IEnumerable执行智能EF查询
本文关键字:执行 智能 EF 查询 IEnumerable | 更新日期: 2023-09-27 18:26:26
我有一个对象集合,这些对象是我从几个查询中得到的,并将它们组合在一起。
以下是PSEUDO代码中的一个示例:
List<myObj> list = new List<myObj>();
list.add(myContext.SqlQuery("SELECT * FROM CATS WHERE CONTAINS("DOGS" NEAR "CATS", 5, 3);
list.add(myContext.SqlQuery("SELECT * FROM CATS WHERE CONTAINS("FISH" NEAR "WATER", 2, 1);
list.add(myContext.SqlQuery("SELECT * FROM CATS WHERE NAME = "Fluffkins");
我很确定我不能在这方面做.Include()
,但如果有办法的话,我会感兴趣的。
我想列举一遍,看看具体的属性。我可以执行foreach并检查每个对象中的myObj.prop1.prop2
,但这将导致对每个对象进行sql查询。
foreach(var x in myEnumerableCollection)
{
var y = x.prop1.prop2 // Not iqueryable so I couldn't include, this means it does a query every time
}
对此的标准解决方案是执行.Include()
,但由于我构建对象集合的方式,我无法做到这一点——它来自多个内联SQL查询。
快速而肮脏的方法可能是自己构造一个SQL查询,类似于:
SELECT * from myObjType inner join prop1 on ... inner join prop2 on ...
然而,将其作为实体对象进行跟踪可能会有问题,而且与使用实体对象相比,内联sql也不太好。
所以我想我想知道我是否可以在我的IEnumerable<T>
上执行.Include
或类似的操作,让EF在后台填充单个查询中的属性,这样foreach的计算速度就会更快。
有什么想法吗?
编辑:.SqlQuery<T>
的问题是它不返回IQueryable<T>
,因此排除了任何链接和延迟求值。
LINQ中有一个Concat
方法,具有以下签名:
public static IQueryable<TSource> Concat<TSource>(
this IQueryable<TSource> source1,
IEnumerable<TSource> source2
)
您可以使用它将查询连接到一个IQueryable<T>
中,而不是构建这些对象的集合(.Include()
)。