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

UnabletosortbypropertynameinLINQOrderBy分享

时间:2023-04-10 18:01:56 C#

UnabletosortbypropertynameinLINQOrderBy错误是LINQtoEntities不识别方法'System.ObjectGetValue(System.Object,System.Object[])'方法,并且此方法不能转换为存储表达式。我的代码是publicstaticGridResultGetAllUsers(intcount,inttblsize,stringsortcreteria){using(UserEntitiesentity=newUserEntities()){vardata=entity.User_Details.Take(count).OrderBy(i=>.GetType().GetProperty(sortcreteria).GetValue(i,null)).Skip(tblsize).ToList();结果.DataSource=数据;结果.Count=entity.User_Details.Count();}返回结果;如何使用按字符串排序的属性名称?只需将以下扩展添加到您的代码中:usingSystem.Linq;使用System.Linq.Expressions;使用系统;命名空间SomeNameSpace{publicstaticclassSomeExtensionClass{publicstaticIQueryableOrderByField(thisIQueryableq,stringSortField,boolAscending){varparam=Expression。参数(类型(T),“p”);varprop=表达式。财产(参数,排序字段);varexp=表达式。Lambda(属性,参数);字符串方法=升序?"OrderBy":"OrderByDescending";Type[]types=newType[]{q.ElementType,exp.Body.Type};varmce=Expression.Call(typeof(Queryable),方法,类型,q.表达式,exp);返回q.Provider.CreateQuery(mce);SomeExtensionClass{privatestaticIOrderedQueryableOrderingHelper(IQueryablesource,stringpropertyName,booldescending,boolanotherLevel){varparam=Expression.Parameter(typeof(T),"p");varproperty=Expression.PropertyOrField(param,propertyName);varsort=Expression.Lambda(属性,参数);varcall=Expression.Call(typeof(Queryable),(!anotherLevel?"OrderBy":"ThenBy")+(descending?"Descending":string.Empty),new[]{typeof(T),property.Type},source.Expression,Expression.Quote(sort));返回(IOrderedQueryable)source.Provider.CreateQuery(call);}publicstaticIOrderedQueryableOrderBy(thisIQueryablesource,stringpropertyName){returnOrderingHelper(source,propertyName,false,false);}publicstaticIOrderedQueryableOrderBy(这个智商ueryablesource,stringpropertyName,booldescending){returnOrderingHelper(source,propertyName,descending,false);}publicstaticIOrderedQueryableThenBy(这个IOrderedQueryable来源,字符串属性名){returnOrderingHelper(来源,属性名,假,真);静态IOrderedQueryableThenBy(此IOrderedQueryable源,字符串propertyName,bool降序){returnOrderingHelper(源,propertyName,降序,true);您可以尝试使用(有点旧的)动态LINQ库来执行此操作:vardata=entity.User_Details.Take(count).OrderBy(sortcriteria).Skip(tblsize).ToList();或者,您仍然可以通过首先将对象移动到内存中来使用原始查询对序列进行排序,因为LINQtoEntities提供程序无法将对ReflectionAPI的调用转换为SQL:vardata=entity.User_Details.Take(count).Skip(tblsize).AsEnumerable().OrderBy(i=>i.GetType().GetProperty(sortcriteria).GetValue(i,null))您可能需要使用表达式树来构造Linq语句OrderBy(x=>x。一些财产)为LINQ/Lambda创建OrderBy表达式动态创建LINQtoentityOrderBy表达式以上是C#学习教程:不能在LINQOrderBy中使用属性名对所有分享的内容进行排序,如果对大家有用需要进一步了解C#学习教程,希望大家多多关注—本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: