将多类型OrderBy表达式存储为属性在一个普通的抽象基类中,我存储了几个用于排序的表达式:publicExpressionOrderByString{get;放;}publicExpressionOrderByInt{get;放;}稍后将在公共基类中使用:if(OrderByString!=null){results=results.OrderBy(OrderByString);}elseif(OrderByInt!=null){results=results.OrderBy(OrderByInt);最后,其中一个将在派生具体类的构造函数中设置:this.OrderByString=c=>c.CustomerID;事实上,我想要一个单独的表达式来表示OrderBy的属性类型。ToString不适用于属性,因为LINQtoEntities不支持它。我所追求的是一种存储表达式的方法,该表达式选择要排序的任何属性,而不管类型如何。如果我尝试更通用的东西,例如:publicExpressionOrder{get;放;}无法将类型“System.Int32”转换为“System.Object”。LINQtoEntities仅支持转换实体数据模型基元类型。另外,如果我尝试稍微修改一下,这也不起作用:publicExpressionOrder{get;放;}this.Order=c=>c.OrderID.ToString();LINQtoEntities无法识别方法“System.StringToString()”方法,并且此方法无法转换为存储表达式。听起来您想要一种方法来在某处堆积一堆Ordering并应用它。但是你不能,因为每个Expression都有自己的类型,在调用OrderBy时由编译器检查。调用OrderBy时,两种类型都必须存在,但其中一种必须放在同一个列表中。隐藏接口后面的第二种类型。publicinterfaceIOrderer{IOrderedQueryableApplyOrderBy(IQueryablesource);IOrderedQueryableApplyOrderByDescending(IQueryable源);IOrderedQueryableApplyThenBy(IOrderedQueryable源);IOrderedQueryableApplyThenByDescending(IOrderedQueryable源);}publicclassOrderer:IOrderer{privateExpression>_orderExpr;publicOrderer(Expression>orderExpr){_orderExpr=orderExpr;}publicIOrderedQueryableApplyOrderBy(IQueryablesource){returnsource.OrderBy(_orderExpr);}publicIOrderedQueryableApplyOrderByDescending(IQueryablesource){returnsource.OrderByDescending(_orderExpr);}publicIOrderedQueryableApplyThenBy(IOrderedQueryablesource){returnsource.ThenBy(_orderExpr);}publicIOrderedQueryableApplyThenByDescending(IOrderedQueryablesource){returnsource.ThenByDescending(_orderExpr);}}publicclassOrderCoordinator{publicList>Orders{get;放;}publicOrderCoordinator(){Orders=newList>();}//笔记,没有返回IOrderedQueryable以支持返回空订单的能力}返回源;}}publicclassCustomer{publicstring}publicintFavNumber{get;放;}}publicclassTester{publicvoidTest(){OrderCoordinatorcoord=newOrderCoordinator();coord.Orders.Add(newOrderer(c=>c.Name));coord.Orders.Add(newOrderer(c=>c.FavNumber));IQueryable查询=Enumerable.Empty().AsQueryable();query=coord.ApplyOrders(查询);字符串结果=query.Expression。字符串();在调试器中:result="OrderingDemo.Customer[].OrderBy(c=>c.Name).OrderBy(c=>c.FavNumber)"所以在你的情况下而不是这个属性:publicExpression>Order{get;放;}使用这个属性publicIOrdererOrder{get;放;如果您使用NuGet.org上的DynamicLinq库,这很容易做到这使您可以编写类似的东西;db.People.Where("Id==8");db.People.OrderBy("创建的ASC");这样您就可以将where子句作为字符串保存或传递。没有大惊小怪,没有麻烦。http://nuget.org/List/Packages/DynamicLINQ考虑使用方法而不是属性。公共抽象IEnumerableApplyOrdering(IEnumerableq);...publicoverrideIEnumerableApplyOrdering(IEnumerableq){returnq.OrderBy(c=>c.CustomerID);}AmyB的回答很好,我自己的解决方案就是基于它。所以我的观点更多是我需要的改进,我可能会及时改进。publicinterfaceIOrderer{IOrderedQueryableApply(IQueryablesource);}publicclassOrderBy:IOrderer{privateExpression>_orderExpr;publicOrderBy(Expression>orderExpr){_orderExpr=orderExpr;}publicIOrderedQueryableApply(IQueryablesource){returnsource.OrderBy(_orderExpr);}}publicclassThenBy:IOrderer{privateExpression>_orderExpr;publicThenBy(Expression>orderExpr){_orderExpr=orderExpr;}publicIOrderedQueryableApply(IQueryablesource){return((IOrderedQueryable)source).ThenBy(_orderExpr);}}publicclassOrderCoordinator{publicList>Orders{get;私有集;}=新列表>();publicIQueryableApplyOrder(IQueryablesource){foreach(IOrdererordererinOrders){source=orderer.Apply(source);}返回源;}publicOrderCoordinatorOrderBy(Expression>orderByExpression){Orders.Add(newOrderBy(orderByExpression));归还这个;}//可以随时间添加更多排序调用publicOrderCoordinatorThenBy(表达式>orderByExpression){Orders.Add(newThenBy(orderByExpression));归还这个;}}使用以下类型指定协调器:publicOrderCoordinatorOrderCoordinator{get;私有集;}=新订单协调器();指定排序顺序:OrderCoordinator。OrderBy(e=>e.MyStringProperty).ThenBy(e=>e.MyIntProperty);应用排序:以上就是C#学习教程:存储多类型OrderBy表达式作为属性分享的全部内容,如果对大家有用并且需要进一步了解C#学习教程,希望大家多多关注——ordered=OrderCoordinator.ApplyOrder(ordered);