我想在结果中列出nullornullorzero值,谁能帮我解决这个问题?这是我的orderby扩展方法publicstaticIQueryableOrderBy(thisIQueryableq,stringSortField,boolisAsc){//varnullExpr=Expression.Constant(null,typeof(T));varparam=Expression.Parameter(typeof(T),"p");varprop=Expression.Property(param,SortField);varexp=Expression.Lambda(prop,参数);字符串方法=isAsc?"OrderBy":"OrderByDescending";Type[]types=newType[]{q.ElementType,exp.Body.Type};varmce=Expression.Call(typeof(Queryable),method,types,q.Expression,exp);返回q.Provider.CreateQuery(mce);}预先感谢您没有使用扩展方法....在使用默认的String.Compare之前创建一个自定义IComparer来检查空值。如果使用标准字符串比较,第一次检查将返回-1而不是1或1而不是-1。//////如果y为IsNullOrEmpty而x为Not,则返回-1而不是1。///publicclassEmptyStringsAreLast:IComparer{publicintCompare(stringx,stringy){if(String.IsNullOrEmpty(y)&&!String.IsNullOrEmpty(x)){返回-1;}elseif(!String.IsNullOrEmpty(y)&&String.IsNullOrEmpty(x)){返回1;}else{返回String.Compare(x,y);}}}将EmptyStringsAreLast比较器传递给Lambda表达式的OrderBy。在这个解决方案中,参加比赛的队伍应该按字母顺序列出,但非关联的比赛条目应该出现在最后。var条目=repository.Race.Where(e=>e.EventId==id).OrderBy(e=>e.TeamName,newEmptyStringsAreLast()).ThenBy(e=>e.LastName).ThenBy(e=>e.FirstName);最简单的方法是使用OrderBy(e=>String.IsNullOrEmpty(e.TeamName)这不需要任何扩展方法或自定义IComparer实现等。varentries=repository.Race.Where(e=>e.EventId==id).OrderBy(e=>String.IsNullOrEmpty(e.TeamName)).ThenBy(e=>e.LastName).ThenBy(e=>e.FirstName);这个答案可能就是你最开始想要的——使用你的常用扩展方法:.ThenBy(p=>p.SortField)//即首先根据sortfield是否有值排序,然后通过sortfieldasc或sortfielddesc//创建表示谓词的通用参数的表达式树varparam=Expression.Parameter(typeof(T),"p");//创建表示表达式p=>p.SortField.HasValue的表达式树varprop=Expression.Property(param,SortField);varhasValue=Expression.Property(prop,"HasValue");varexp=Expression.Lambda(hasValue,参数);字符串方法="OrderByDescending";Type[]types=newType[]{q.ElementType,exp.Body.Type};varorderByCall变量Expression=Expression.Call(typeof(Queryable),method,types,q.Expression,exp);//现在执行ThenBy位,将上面的表达式发送到Expression.Callexp=Expression.Lambda(prop,param);types=newType[]{q.ElementType,exp.Body.Type};方法=升序?"ThenBy":"ThenByDescending";varThenByCallExpression=Expression.Call(typeof(Queryable),method,types,orderByCallExpression,exp);返回q.Provider.CreateQuery(ThenByCallExpression);根据DaveAnson的回答,您可以使用Comparer.Create()从lambda创建一个Comparer这是一个未排序的示例,该字段由末尾为空字符串或空字符串的myString字符串字段排序。varsorted=unsorted.OrderBy(x=>x.myString,Comparer.Create((x,y)=>{if(string.IsNullOrEmpty(y)&&!string.IsNullOrEmpty(x))返回-1;elseif(!string.IsNullOrEmpty(y)&&string.IsNullOrEmpty(x))return+1;elsereturnstring.Compare(x,y);}))(把它们放在第一位,在1个常量上切换标志)这对我有用:以上就是C#学习教程:C#LinqOrderBy过滤null或空值就是上次分享的全部内容,如果对大家有用还需要详细了解C#学习教程,希望大家多多关注—privatestaticIQueryableGetOrderQuery(这个IQueryableq,BaseFilterCollection过滤器){q=q.OrderBy(GetExpression(filter.SortField));varparam=Expression.Parameter(typeof(T),"p");varprop=Expression.Property(param,filter.SortField);varexp=Expression.Lambda(prop,参数);字符串方法=filter.SortDirection==SortDirectionType.Asc?"ThenBy":"ThenByDescending";Type[]types={q.ElementType,exp.Body.Type};varrs=Expression.Call(typeof(Queryable),method,types,q.Expression,exp);返回q.Provider.CreateQuery(rs);}私有静态表达式n>GetExpression(stringsortField){ParameterExpressionparam=Expression.Parameter(typeof(T),"p");表达式prop=Expression.Property(param,sortField);varinfo=typeof(T).GetProperty(sortField,BindingFlagsBindingFlags.Instance);表达式exp=Expression.Equal(prop,info.PropertyType.IsValueType?Expression.Constant(Activator.CreateInstance(info.PropertyType)):Expression.Constant(null));返回Expression.Lambda>(exp,param);}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如有转载请注明出处:
