1

次のスニペットは、私が欲しいものを示しています:

public static class DblinqExtension
{
    public static int MaxId<T>(this DbLinq.Data.Linq.Table<T> table) where T : class
    {
        var val = table.OrderByDescending(x => "Id").FirstOrDefault();
        return Convert.ToInt32(val);
    }
}

DbMetal を使用して、マッピング クラスを生成しました。私が持っているすべてのテーブルには列 ID (明らかに整数) があり、MAX ID を知りたいです。

スニペットを機能させる方法を知っている人はいますか??

ありがとう!


この記事を見つけました: OrderBy with a String keySelector

その提案を適用すると、私のコードは次のようになります。

public static int MaxId<T>(this DbLinq.Data.Linq.Table<T> table) where T : class
{
    var val = table.OrderByDescending(CreateSelectorExpression<T>("Id")).FirstOrDefault();
    return Convert.ToInt32(val);
}

private static Expression<Func<T, Int32>> CreateSelectorExpression<T>(string propertyName) where T : class
{
    var parameterExpression = Expression.Parameter(typeof(T));
    return (Expression<Func<T, Int32>>)Expression.Lambda(
        Expression.PropertyOrField(parameterExpression, propertyName), 
        parameterExpression
    );
}

しかし今、私はエラーが発生します:

値を null にすることはできません。パラメータ名:キー

4

2 に答える 2

2

確かではありませんが、試してみてください

var Result = from x in table select x.Max ( x => x.Id );

編集 - Id を文字列として式に取り込む必要がある場合:

var Result = from x in table select x.Max ( x => x.GetType().GetProperty ("Id").GetGetMethod().Invoke (x, null) );

編集 - 分割する必要がある場合:

var Result1 = from x in table select x; var Result2 = Result1.Max(x => x.GetType().GetProperty("Id").GetGetMethod().Invoke(x, null)); 

編集-「Id」がフィールドの場合、これが必要です:

var Result1 = from x in table select x; 
var Result2 = Result1.Max(x => x.GetType().GetField ( "Id" ).GetValue(x));
于 2011-07-20T21:08:55.283 に答える
1

よし、わかった!!

    public static int MaxId<T>(this DbLinq.Data.Linq.Table<T> table) where T : class
    {
        var param = Expression.Parameter(typeof(T), "p");
        var body = Expression.PropertyOrField(param, "ID");
        var lambda = Expression.Lambda<Func<T, int>>(body, param);

        var val = table.OrderByDescending(lambda).FirstOrDefault();
        return Convert.ToInt32(val.GetType().GetProperty("ID").GetGetMethod().Invoke(val, null));
    }

@Yahia さん、GetProperty の部分に関するヒントをありがとうございます。

于 2011-07-21T08:41:25.683 に答える