如何对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>,因此排除了任何链接和延迟求值。

如何对T的IEnumerable执行智能EF查询

LINQ中有一个Concat方法,具有以下签名:

public static IQueryable<TSource> Concat<TSource>(
    this IQueryable<TSource> source1,
    IEnumerable<TSource> source2
)

您可以使用它将查询连接到一个IQueryable<T>中,而不是构建这些对象的集合(.Include())。