2012-08-31 33 views
0

我有一个列表<Obj1>在WCF服务中创建。 Prop3实际上是作为IQueryable实现的,但是是IEnumerable,因为我需要将已解析的查询通过线路传递回来,因为从WCF返回值时会丢失上下文,并且存在问题。为了性能的原因,我希望能够在sql server上立即运行Prop3中的所有查询。目前,我正在做list.ForEach(o => o.Prop3 = o.Prop3.ToArray()),但这显然会一次运行这些查询。有什么办法可以将所有内容发送到sql server来同时处理所有内容吗?带有IQueryable属性的Linq to Entities对象同时运行所有查询

一两件事,不是很明显:

builder.CreateObject returns an IQueryable<Obj1> 

public IEnumerable<Obj1> CreateListOfObjects(IQueryable<Entity> query) 
{ 
    List<Obj1> list = new List<Obj1>(); 
    foreach(var builder in Builders) 
    list.AddRange(builder.CreateObject(query)); 
    } 

    list.ForEach(o => o.Prop3 = o.Prop3.ToArray()); 
    return list.ToArray(); 
} 

public class Obj1 
{ 
    public string Prop1 {get;set;} 
    public string Prop2 {get;set;} 
    public IEnumerable<Obj2> Prop3 {get;set;} 
} 
+0

请通过SO的可用工具编辑其余问题。 –

回答

1

我不知道如果我完全清楚是什么问题,而是一个IQueryable<T>ISIEnumerable<T>,所以从界面的角度来看,你应该罚款。

这条线:

list.ForEach(o => o.Prop3 = o.Prop3.ToArray()); 

似乎表明您查询是懒加载Obj2 S和需要通过调用ToArray()明确载入Obj2秒。你可能只是需要包括Obj2那时你使用类似加载Obj1 S:

list.AddRange(builder.CreateObject(query.Include("Prop3"))); 

Prop3是模型中的导航属性(通常使用复数的实体名称)的名称。

注意

我不知道这是否是调用Include(可能更有意义在你的对象生成器),但是这是你所提供的代码中的最佳位置最好的地方。

+0

我接受了这个答案,因为它使我找到了最终的解决方案,即在实际查询实体的位置包含所需的所有实体。 – light