1

我有一组对象,我从几个查询中获得并将它们组合起来。

这是 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 也不是很好。

所以我想我想知道我是否可以以某种方式.Include对我执行一个或类似的操作,IEnumerable<T>以便让 EF 在幕后填充单个查询中的属性,以便 foreach 更快地评估。

有任何想法吗?

编辑:问题.SqlQuery<T>在于它不会返回IQueryable<T>,因此排除了任何链接和惰性评估。

4

1 回答 1

0

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

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

除了构建这些对象的集合之外,您还可以使用它来将您的查询连接到一个IQueryable<T>您可以以通常方式使用的 ( .Include()) 中。

于 2013-08-05T15:39:55.070 回答