我有一个List< Obj1>在WCF服务中创建的。 Prop3实际上是作为IQueryable
实现的,但是是IEnumerable
因为我需要通过网络传递已解析的查询,因为从WCF返回值时上下文丢失并且存在问题。我希望能够出于性能原因在sql server上同时运行Prop3中的所有查询。目前,我正在做list.ForEach(o => o.Prop3 = o.Prop3.ToArray())
,但这显然是一次一个地运行这些查询。有没有办法将所有内容发送到sql server来一次处理所有内容?
有一点不明显:
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 :(得分:1)
我不确定我是否完全清楚问题是什么,但是IQueryable<T>
IS 是IEnumerable<T>
,所以从界面的角度来看你应该没问题
这一行:
list.ForEach(o => o.Prop3 = o.Prop3.ToArray());
似乎表明您的查询延迟加载Obj2
,您需要通过调用Obj2
显式加载ToArray()
。使用以下内容加载Obj2
时,您可能只需要包含Obj1
:
list.AddRange(builder.CreateObject(query.Include("Prop3")));
Prop3
是模型中导航属性的名称(通常是实体名称复数)。
注意
我不知道这是否是调用Include
的最佳位置(可能在您的对象构建器中更有意义),但这是您提供的代码中最佳位置。
答案 1 :(得分:0)