gpt4 book ai didi

c# - 具有 null 属性的嵌套属性的动态 linq 排序

转载 作者:可可西里 更新时间:2023-11-01 08:45:34 27 4
gpt4 key购买 nike

我正在使用我从 here 获得的这个动态 linq orderby 函数.

这适用于嵌套属性,所以我可以这样做:

var result = data.OrderBy("SomeProperty.NestedProperty");

问题是,如果 SomeProperty 为空,则在 NestedProperty 上执行 OrderBy 会抛出臭名昭著的“对象引用未设置为对象的实例”。

我的猜测是我需要自定义以下行来处理异常:

expr = Expression.Property(expr, pi);

// Or

LambdaExpression lambda = Expression.Lambda(delegateType, expr, arg);

我想过创建一个语句体,在最坏的情况下我可以使用 try catch 但它不起作用,因为你不能在 orderby linq 语句中有语句体:“带有语句体的 lambda 表达式不能转换为表达式树”

我在这里迷路了,关于我如何完成这个有什么建议吗?

顺便说一句,这是针对 Linq to Objects 的,与数据库无关。

最佳答案

static void Main(string[] args)
{
var data = new List<MyType>() {
new MyType() { SomeProperty = new Inner() { NestedProperty = "2" }},
new MyType() { SomeProperty = new Inner() { NestedProperty = "1" }},
new MyType() { SomeProperty = new Inner() { NestedProperty = "3" }},
new MyType(),
}.AsQueryable();
var sorted = data.OrderBy(x => GetPropertyValue(x, "SomeProperty.NestedProperty"));

foreach (var myType in sorted)
{
try
{
Console.WriteLine(myType.SomeProperty.NestedProperty);
}
catch (Exception e)
{
Console.WriteLine("Null");
}
}
}

public static object GetPropertyValue(object obj, string propertyName)
{
try
{
foreach (var prop in propertyName.Split('.').Select(s => obj.GetType().GetProperty(s)))
{
obj = prop.GetValue(obj, null);
}
return obj;
}
catch (NullReferenceException)
{
return null;
}
}

关于c# - 具有 null 属性的嵌套属性的动态 linq 排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17647627/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com