为了账号安全,请及时绑定邮箱和手机立即绑定

动态 Linq Core OrderBy 可空子属性

动态 Linq Core OrderBy 可空子属性

C#
慕桂英546537 2022-07-23 17:43:09
当我尝试使用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 名称。所有控制活动都需要公司和流程,并且不需要参考。
查看完整描述

1 回答

?
白猪掌柜的

TA贡献1893条经验 获得超10个赞

在@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 QUERYABLE

var finalList = unionList.AsQueryable();


//DYNAMIC SORT

if (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);

    }


查看完整回答
反对 回复 2022-07-23
  • 1 回答
  • 0 关注
  • 176 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信