当前位置: 首页 > 编程语言 > C#

LINQtoSQL-为什么我不能在ORDERBY之后使用WHERE?

时间:2023-04-10 18:25:33 C#

LINQtoSQL-为什么我不能在ORDERBY之后使用WHERE?以下代码://选择所有订单varorders=fromoinFoodOrderswhereo.STATUS=1orderbyo.ORDER_DATEdescendingselecto;//如果指定了客户ID,则只选择特定客户的订单if(customerID!=null){orders=orders.Where(o=>customerID.Equals(o.CUSTOMER_ID));给我以下错误:无法将类型“System.Linq.IQueryable”隐式转换为“System.Linq.IOrderedQueryable”。有一个显式转换(你错过了演员表吗?)我通过在最后订购来修复错误://选择所有订单varorders=fromoinFoodOrderswhereo.STATUS=1selecto;//如果指定了客户ID,则只选择特定客户的订单if(customerID!=null){orders=orders.Where(o=>customerID.Equals(o.CUSTOMER_ID));}//我被迫在这里进行排序orders=orders.OrderBy(o=>o.ORDER_DATE).Reverse();但我想知道为什么会出现这种限制?API的设计原因是不能在使用operatororderby之后加上where约束?OrderBy的返回类型是IOrderedQueryable,所以这是orders变量的类型(部分原因是最后有一个无操作投影)——但是Where的返回类型只是IQueryable。基本上你混合了无操作投影和隐式类型的局部变量,查询的最后一个活动部分是排序,然后你想重新分配变量。基本上,这是一个令人不快的组合。您可以这样解决:IQuerableorders=fromoinFoodOrderswhereo.STATUS==1orderbyo.ORDER_DATEdescendingselecto;//如果指定了客户ID,则只选择特定客户的订单if(customerID!=null){orders=orders.Where(o=>customerID.Equals(o.CUSTOMER_ID));或者,如果您使用点表示法显式执行无操作投影(我怀疑SQL转换器是否足够智能以应对!)类型推断是可能的:varorders=FoodOrders.Where(o=>o.STATUS==1).OrderByDescending(o=>o.ORDER_DATE).Select(o=>o);//如果指定了客户ID,则只选择特定客户的订单if(customerID!=null){orders=orders.Where(o=>customerID.Equals(o.CUSTOMER_ID));或者作为最后一个有点奇怪的建议,您可以更改初始where和orderby子句的顺序。这在LINQtoObjects中是个坏主意,但不应该在LINQtoSQL中产生影响:varorders=fromoinFoodOrdersorderbyo.ORDER_DATEdescendingwhereo.STATUS==1selecto;//如果指定了客户ID,则只选择特定客户的订单if(customerID!=null){orders=orders.Where(o=>customerID.Equals(o.CUSTOMER_ID));现在,就API设计的“原因”而言:OrderBy和OrderByDescending返回一个IOrderedQueryable,这样您就可以将它与ThenBy和ThenByDescending链接起来,这取决于现有的订单,如果您明白我的意思,这可能会成为次要订单。重要的是要注意var在编译时是强类型和解释的。您的第一个代码片段基本上与以下内容相同:IOrderedQueryableorders=fromoinFoodOrderswhereo.STATUS=1orderbyo.ORDER_DATEdescendingselecto;当您以这种方式编写代码时,很明显为什么不能将IQueryable分配给声明为IOrderedQueryable的变量。你不能把它想成对象一样varobjectaString="Testing...";varbString="测试中...";字符串=1;//有效bString=1;//失败,因为1不是字符串http://msdn.microsoft.com/en-us/library/bb384061.aspx以上是C#学习教程:LINQtoSQL-为什么我不能在ORDERBY后使用WHERE?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: