猿问

动态 Linq Core OrderBy 可空子属性

当我尝试使用System.Linq.Dynamic.Core库来订购列表时,我得到一个NullReferenceException.


var myFinalOrderedList = myList.AsQueryable()

    .OrderBy("Company.Name asc, Process.Name asc, Reference.Name asc")

    .ToList();

Reference.Name OrderBy因为是可以为空的,所以发生了空异常Reference。


如何按可空Reference对象排序?


StackTrace(敏感信息替换为“****”):


    {

  "ClassName": "System.NullReferenceException",

  "Message": "Object reference not set to an instance of an object.",

  "Data": null,

  "InnerException": null,

  "HelpURL": null,

  "RemoteStackTraceString": null,

  "RemoteStackIndex": 0,

  "ExceptionMethod": null,

  "HResult": -2147467261,

  "Source": "Anonymously Hosted DynamicMethods Assembly",

  "WatsonBuckets": null

}

Company、Process 和 Reference 是主列表 (ControlActivity) 的外键。这三个几乎都只有 PK Id 和 NVARCHAR 名称。所有控制活动都需要公司和流程,并且不需要参考。


慕桂英546537
浏览 177回答 1
1回答

白猪掌柜的

在@Alen 和https://github.com/StefH/System.Linq.Dynamic.Core/issues/98发布的链接的帮助下,我找到了自己问题的答案。下面,我将展示更多我的实际代码,这就是它看起来与问题不同的原因。答案在于StaticMethod.ConvertToNullableNested. 例如,我正在传递,{i.ColumnName} {i.SortOrder} = "Company.Name asc"它正在返回Company == null ? null : Company.Name asc。然后我将每个排序附加在一起并传递给 OrderBy。//TURN INTO QUERYABLEvar finalList = unionList.AsQueryable();//DYNAMIC SORTif (input.SortModel?.SortModelItems?.Count > 0){    string sortQry = String.Empty;    foreach (var i in input.SortModel.SortModelItems)    {        sortQry = sortQry + $"{StaticMethod.ConvertToNullableNested($"{i.ColumnName} {i.SortOrder}")}, ";    }    sortQry = sortQry.TrimEnd(", ");    finalList = finalList.OrderBy(sortQry);}//RETURN AND REMEMBER TO .TAKE(Pagesize)return Tuple.Create(finalList.Take(input.PageSize).ToList(), finalRowCount);public static string ConvertToNullableNested(string expression, string result = "", int index = 0)    {        //Transforms => "a.b.c" to "(a != null ? (a.b != null ? a.b.c : null) : null)"        if (string.IsNullOrEmpty(expression))            return null;        if (string.IsNullOrEmpty(result))            result = expression;        var properties = expression.Split(".");        if (properties.Length == 0 || properties.Length - 1 == index)            return result;        var property = string.Join(".", properties.Take(index + 1));        if (string.IsNullOrEmpty(property))            return result;        result = result.Replace(expression, $"{property} == null ? null : {expression}");        return ConvertToNullableNested(expression, result, index + 1);    }
随时随地看视频慕课网APP
我要回答