如何在IE的数量上执行智能EF查询?

时间:2013-08-05 15:35:05

标签: c# entity-framework

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

以下是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评估得更快。 / p>

有什么想法吗?

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

1 个答案:

答案 0 :(得分:0)

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

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

您可以使用此功能将查询加入IQueryable<T>,而不是构建这些对象的集合,您可以按常规方式使用.Include()