Linq 易读和分类

Linq 易读和分类,linq,Linq,似乎在收到IQueryable后,我无法修改查询以启用排序。下面是代码片段。 我的印象是,使用IQueryable(而不是do IEnumerable),我应该能够做我正在尝试的事情 using (oc1 = new NWEntities()) { string customerid = "ALFKI"; var q = GetOrders((o) => o.CustomerID == customerid); q.OrderBy(o => o.ShipCi

似乎在收到IQueryable后,我无法修改查询以启用排序。下面是代码片段。 我的印象是,使用IQueryable(而不是do IEnumerable),我应该能够做我正在尝试的事情

using (oc1 = new NWEntities())
{
    string customerid = "ALFKI";
    var q = GetOrders((o) => o.CustomerID == customerid);

    q.OrderBy(o => o.ShipCity);   // DOES NOT WORK !!!!!!!!
    foreach (var x in q)
    {
        Console.WriteLine(string.Format("Order#:{0} City:{1} for Customer {2}",
                                    x.OrderID,
                                    x.ShipCity,
                                    customerid));
    }
}

// Returns IQueryable
IQueryable<Order> GetOrders(Expression<Func<Order, Boolean>> predicate)
{            
    return (oc1.Orders.Where(predicate));            
}
使用(oc1=new NWEntities())
{
字符串customerid=“ALFKI”;
var q=GetOrders((o)=>o.CustomerID==CustomerID);
q、 OrderBy(o=>o.ShipCity);//不起作用!!!!!!!!
foreach(q中的变量x)
{
Console.WriteLine(string.Format(“订单#:{0}城市:{1}用于客户{2}”),
x、 医嘱ID,
x、 船舶城,
客户ID);
}
}
//返回IQueryable
IQueryable GetOrders(表达式谓词)
{            
return(oc1.Orders.Where(谓词));
}
不知何故,输出没有按城市排序。我错过了什么明显的东西吗?
谢谢您的时间。

您需要将
OrderBy
的结果存储在另一个变量中。您对列表进行了排序,然后默默地删除了结果,并对原始列表进行了迭代:

var q = GetOrders(...);

// notice I store in **q2**
var q2 = q.OrderBy(o => o.ShipCity);
foreach (var x in q2)

您需要将OrderBy的结果存储在另一个变量中。您对列表进行了排序,然后默默地删除了结果,并对原始列表进行了迭代:

var q = GetOrders(...);

// notice I store in **q2**
var q2 = q.OrderBy(o => o.ShipCity);
foreach (var x in q2)

谢谢你的回复。我认为可以继续构建linq查询变量,它会一直添加到表达式树中,直到您实际执行查询为止(通过doing.ToList()、foreach()等)。此外,无论我返回IEnumerable还是IQueryable,代码都可以工作。同样,我认为(似乎有误)只有当查询类型为IQueryable时才能修改它。@Rahul:你是对的。但是,您可以这样做,您必须将每个附加结果存储在另一个变量中。正如您所观察到的,仅仅调用
q.OrderBy(o=>o.ShipCity)
并不起任何作用。您需要执行
var q2=q.OrderBy(o=>o.ShipCity)
将结果存储在某处。@Rahul:您可以在
IEnumerable
IQueryable
上使用
LINQ
方法。不同之处在于,
IQueryable
将惰性地组合调用,并且在请求结果之前不会进行实际计算<但是,code>IEnumerable将立即对内存中的集合执行
LINQ
,而不是延迟计算。当使用LINQ进行任何操作时,您应该使用IQueryable组合多个查询调用以获得最佳性能。非常感谢您花时间澄清。感谢您的回复。我认为可以继续构建linq查询变量,它会一直添加到表达式树中,直到您实际执行查询为止(通过doing.ToList()、foreach()等)。此外,无论我返回IEnumerable还是IQueryable,代码都可以工作。同样,我认为(似乎有误)只有当查询类型为IQueryable时才能修改它。@Rahul:你是对的。但是,您可以这样做,您必须将每个附加结果存储在另一个变量中。正如您所观察到的,仅仅调用
q.OrderBy(o=>o.ShipCity)
并不起任何作用。您需要执行
var q2=q.OrderBy(o=>o.ShipCity)
将结果存储在某处。@Rahul:您可以在
IEnumerable
IQueryable
上使用
LINQ
方法。不同之处在于,
IQueryable
将惰性地组合调用,并且在请求结果之前不会进行实际计算<但是,code>IEnumerable将立即对内存中的集合执行
LINQ
,而不是延迟计算。使用LINQ时,您应该使用IQueryable组合多个查询调用以获得最佳性能。非常感谢您花时间澄清。