BuildinganOrderByLambdaExpressionBasedonAttributesofaChildEntity我正在尝试使用lambda表达式生成带有实体列的LINQOrderBy子句名称作为字符串输入(在下面的“sortOn”变量中)。下面的代码适用于像“代码”这样的sortOn值生成一个lambdap=>p.Code但我还想对lambdap=>p.Category.Description的可能子实体进行排序所以在这个例子中我只想设置sortOn="Category.Description"并生成正确的lamdba表达式。是否可以?欢迎就最佳方法提出任何建议。此代码适用于简单情况:varparam=Expression.Parameter(typeof(Product),"p");varsortExpression=Expression.Lambda(Expression.Property(param,sortOn),param);如果(sortAscending??true){products=products.OrderBy(sortExpression);}else{products=products.OrderByDescending(sortExpression);}这道题的用例是显示一个数据网格,并且能够对数据进行排序,只需要把要排序的列名传回服务器即可。我想使解决方案通用,但现在已经开始使用特定类型(示例中的产品)。这将生成正确的lambda表达式:varsortOn="Category.Description";varparam=Expression.Parameter(typeof(Product),"p");varparts=sortOn.Split('.');表达式parent=param;foreach(varpartinparts){parent=Expression.Property(parent,part);}varsortExpression=Expression.Lambda(parent,param);您可以使用动态LINQ查询库轻松完成此操作。假设您有一个用于Product的IQueryable实现,您可以轻松地做到:IQueryableproducts=...;//动态排序.products=products.OrderBy("Category.Description");博客文章有一个指向库的链接,你必须自己在你的解决方案中构建/包含项目,但它工作得很好并且解析非常健壮。它可以防止您自己编写解析代码;即使对于这么简单的事情,如果需要扩展,库也会为您提供帮助,而本机解决方案则不需要。它还具有许多其他动态运算符(Select、Where等),因此您可以执行其他动态操作。引擎盖下没有魔法,它只是解析传递给它的字符串,然后根据解析结果创建一个lambda表达式。如果你不需要表达式,怎么样:products=products.Orderby(p1=>p1.Code).ThenBy(p2=>p2.Category.Description)depth,不仅仅是子publicstaticIEnumerableCustomOrderBy(thisIEnumerablesource,FunckeySelector){Listlist=newList();列表returnList=newList();列表indexList=newList();如果(来源==null)返回null;如果(source.Count()list.Add(keySelector(sc).ToString()));//提取待排序的属性字符串list.Sort();//sortthelistofstringsforeach(stringlinlist)//根据顺序提取source的索引列表{inti=0;//list.ForEach(l=>foreach(varsinsource.ToList()){if(keySelector(s).ToString()==l)break;i++;}indexList.Add(i);}indexList.ForEach(i=>returnList.Add(source.ElementAt(i)));//根据上面提取的索引重新排列sourcereturnreturnList;}}publicclassName{publicstringFName{get;set;}publicstringLName{get;set;}}公开课美食血腥{公共名称名称{得到;放;}}publicclassSortChild{publicvoidSortOn(){Listcategory=newList{newCategory(){Name=newName(){FName="sahil",LName="chauhan"}},newCategory(){Name=newName(){FName="pankaj",LName="chauhan"}},newCategory(){Name=newName(){FName="harish",LName="thakur"}},newCategory(){Name=newName(){FName="deepak",LName="bakseth"}},新类别(){Name=newName(){FName="manish",LName="dhamaka"}},新类别(){Name=newName(){FName="arev",LName="raghaka"}}};vara=category.CustomOrderBy(s=>s.Name.FName);它现在是一个自定义方法,它只适用于字符串属性,但可以使用泛型将其重置为适用于任何原始类型我希望这会有所帮助。下面是一个扩展的OrderBy方法,它适用于任意数量的嵌套参数。publicstaticIQueryableOrderBy(这个IQueryable查询,字符串键,boolasc=true){try{stringorderMethodName=asc?"OrderBy":"OrderByDescending";类型类型=typeof(T);输入propertyType=type.GetProperty(key)?.PropertyType;;varparam=Expression.Parameter(type,"x");表达式parent=param;varkeyParts=key.Split('.');for(inti=0;i1){if(i==0){propertyType=type.GetProperty(keyPart).PropertyType;}else{propertyType=propertyType.GetProperty(keyPart).PropertyType;}}}MethodCallExpressionorderByExpression=Expression.Call(typeof(Queryable),orderMethodName,newType[]{type,propertyType},query.Expression,CreateExpression(type,key));返回query.Provider.CreateQuery(orderByExpression);}catch(Exceptione){返回查询;我在本文中定义的解决方案中使用了CreateExpression方法。OrderBy扩展方法的用法如下。IQueryableq=[你的数据库上下文].Foos.AsQueryable();IQueryablep=null;p=q.OrderBy("myBar.name");//升序排序//或p=q.OrderBy("myBar.name"",false);//降序排序//Materializevarresult=p.ToList();TypeFoo及其属性也来自同一篇文章作为CreateExpression方法,希望这篇文章对你有所帮助以上是C#学习教程:基于子实体属性构建OrderByLambda表达式全部内容分享,如果对你有用还需要了解更多关于C#学习教程,希望大家多多关注。本文采集自网络,不代表立场,如涉及侵权,请点击右下角联系管理员删除。如需转载,请注明出处: