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 --- from Orders”。这意味着所有订单都是选择的。

这种情况我该怎么办。:D

4

1 回答 1

4

删除.AsEnumerable()呼叫。

AsEnumerable将您的 ObjectQuery 强制转换为IEnumerable<Order>,这会阻止编译器找到正确的重载(它将使用Enumerable.Where而不是Queryable.Where,因为list它的类型是IEnumerable<Order>)。这就是为什么只有查询的第一部分将被发送到服务器("select * from Orders"),其余部分将在内存中执行。

如果您删除对 的调用AsEnumerable,您的条件将正确应用于您的 ObjectQuery,从而允许它们在服务器上执行。

于 2012-08-17T06:55:54.697 回答