13

hereから取得したこの動的linq orderby関数を使用しています。

これはネストされたプロパティでうまく機能するので、これを行うことができます:

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

問題は、SomeProperty が null の場合、NestedProperty で OrderBy を実行すると、悪名高い「オブジェクト参照がオブジェクトのインスタンスに設定されていません」がスローされることです。

例外を処理するには、次の行をカスタマイズする必要があると思います。

expr = Expression.Property(expr, pi);

// Or

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

最悪のシナリオで try catch を使用できるステートメント本体を作成することを考えましたが、orderby linq ステートメント内にステートメント本体を含めることができないため、それは機能しませんでした。式ツリー」

私はここで迷子になっています。これを達成する方法について何か提案はありますか?

ちなみに、これはLinq to Objects用で、データベース関連ではありません。

4

2 に答える 2

10
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;
    }
}
于 2013-07-15T09:19:48.690 に答える