具有IQueryable属性的Linq to Entities对象同时运行所有查询

时间:2012-08-31 19:02:42

标签: c# linq entity-framework linq-to-entities iqueryable

我有一个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;}
}

2 个答案:

答案 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)