我有一组对象,我从几个查询中得到它们并将它们组合在一起。
以下是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 ...
所以我想我想知道我是否可以在我的.Include
上以某种方式执行IEnumerable<T>
或类似操作,让幕后的EF在一个查询中填充属性,以便foreach评估得更快。 / p>
有什么想法吗?
编辑:.SqlQuery<T>
的问题在于它不会返回IQueryable<T>
,因此排除任何链接和延迟评估的排序。
答案 0 :(得分:0)
LINQ中有一个Concat
方法,带有以下签名:
public static IQueryable<TSource> Concat<TSource>(
this IQueryable<TSource> source1,
IEnumerable<TSource> source2
)
您可以使用此功能将查询加入IQueryable<T>
,而不是构建这些对象的集合,您可以按常规方式使用.Include()
。