Dynamic Linq OrderBy null error
本文关键字:error null OrderBy Linq Dynamic | 更新日期: 2023-09-27 18:27:06
我使用动态Linq根据传入的列对结果集进行排序。当用户单击表列时,我使用它对表进行排序。
如果im排序的属性是一个null类,则代码会溢出,我希望能够按字符串动态排序,但如果该属性是类,则可以满足null。
这是我使用的System.Linq.Dynamic类中的代码。
public static IQueryable OrderBy(this IQueryable source, string ordering,
params object[] values)
{
if (source == null) { throw new ArgumentNullException("source"); }
if (ordering == null) { throw new ArgumentNullException("ordering"); }
ParameterExpression[] parameters = new ParameterExpression[1]
{
Expression.Parameter(source.ElementType, "")
};
IEnumerable<DynamicOrdering> enumerable = new ExpressionParser(
parameters, ordering, values).ParseOrdering();
Expression expression = source.Expression;
string str1 = "OrderBy";
string str2 = "OrderByDescending";
foreach (DynamicOrdering dynamicOrdering in enumerable)
{
expression = (Expression) Expression.Call(typeof (Queryable),
dynamicOrdering.Ascending ? str1 : str2, new Type[2]
{
source.ElementType,
dynamicOrdering.Selector.Type
}, new Expression[2]
{
expression,
(Expression) Expression.Quote((Expression) Expression.Lambda(
dynamicOrdering.Selector, parameters))
});
str1 = "ThenBy";
str2 = "ThenByDescending";
}
return source.Provider.CreateQuery(expression);
}
并称之为
if (property.PropertyType == typeof(Sitecore.Data.Items.Item))
{
orderByProperty = property.Name + ".Name";
}
else
{
orderByProperty = property.Name;
}
return tableOrder == TableOrder.az
? projects.OrderBy(orderByProperty + " ascending").ToList()
: projects.OrderBy(orderByProperty + " descending").ToList();
属性有时是一个类,如果是这种情况,我希望能够通过类上名为name的字段对其进行排序。上面的代码是有效的,但是如果属性是一个类并且为null,那么它就失效了。
如何按字段排序并在末尾添加空项?
我找到了答案。用以下内容替换System.Linq.DynamicQueryable类中的OrderBy查询。它将处理作为对象的属性中的null。
public static IQueryable OrderBy(this IQueryable source, string ordering,
params object[] values)
{
//This handles nulls in a complex object
var orderingSplit = ordering.Split(new char[] {' '},
StringSplitOptions.RemoveEmptyEntries);
var sortField = orderingSplit[0];
var splitted_sortField = sortField.Split(new char[] { '.' },
StringSplitOptions.RemoveEmptyEntries);
if (splitted_sortField.Length > 1)
{
sortField = "iif(" + splitted_sortField[0] + "==null,null," + sortField + ")";
}
ordering = orderingSplit.Length == 2
? sortField + " " + orderingSplit[1]
: sortField;
if (source == null) throw new ArgumentNullException("source");
if (ordering == null) throw new ArgumentNullException("ordering");
ParameterExpression[] parameters = new ParameterExpression[] {
Expression.Parameter(source.ElementType, "") };
ExpressionParser parser = new ExpressionParser(parameters, ordering, values);
IEnumerable<DynamicOrdering> orderings = parser.ParseOrdering();
Expression queryExpr = source.Expression;
string methodAsc = "OrderBy";
string methodDesc = "OrderByDescending";
foreach (DynamicOrdering o in orderings)
{
queryExpr = Expression.Call(
typeof(Queryable), o.Ascending ? methodAsc : methodDesc,
new Type[] { source.ElementType, o.Selector.Type },
queryExpr, Expression.Quote(Expression.Lambda(o.Selector, parameters)));
methodAsc = "ThenBy";
methodDesc = "ThenByDescending";
}
return source.Provider.CreateQuery(queryExpr);
}
从这里获取代码,并将其直接烘焙到DynamicLinq函数中。
动态LINQ表达式中的空引用异常