0

我有一个在 WCF 服务中创建的 List<Obj1>。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;}
}
4

2 回答 2

1

我不确定我是否完全清楚问题是什么,但是IQueryable<T> IS an IEnumerable<T>,所以从界面的角度来看你应该没问题。

这一行:

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

似乎表明您的查询正在延迟加载Obj2s 并且您需要Obj2通过调用显式加载 s ToArray()Obj2当您使用以下方式加载 s 时,您可能只需要包含s Obj1

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

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

笔记

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

于 2012-08-31T21:44:20.727 回答
0

听起来您正在寻找 Contains 扩展方法。请参阅http://www.thinqlinq.com/Post.aspx/Title/Use-the-new-LINQ-Contains-extension-method-for-the-SQL-IN-clause

于 2012-08-31T19:16:50.583 回答