2

OrderID、OrderName、CreateTime、EndTimeなどのOrdersクラスがあります...ここで、メソッドは次のとおりです。

private TmpContext context = new TmpContext();
public List<Order> GetOrders(string id,string name,DateTime createTime)
{
      var list= context.Orders.AsEnumerable();
      if(!string.isNullOrEmpty(id))
           list = list.Where(l=>l.OrderID.Contains(id));
      if(!string.isNullOrEmpty(name))
           list = list.Where(l=>l.OrderName.Contains(name));
      // other conditions 

      return list.ToList();
}

Linqpad、GetOrders(2124、 "Cloth"、DateTime.Now);を使用して、SQLが "select ---fromOrders"であることを確認します。これは、すべての注文が選択されたことを意味します。

この状況で何ができますか。:D

4

1 に答える 1

4

通話を削除し.AsEnumerable()ます。

AsEnumerableObjectQueryをにキャストします。IEnumerable<Order>これにより、コンパイラは正しいオーバーロードを見つけることができなくなります(は、型であるため、Enumerable.Whereの代わりに使用されます)。そのため、クエリの最初の部分のみがサーバー()に送信され、残りはメモリ内で実行されます。Queryable.WherelistIEnumerable<Order>"select * from Orders"

の呼び出しを削除するとAsEnumerable、条件がObjectQueryに正しく適用され、サーバーで実行できるようになります。

于 2012-08-17T06:55:54.697 に答える