DbLinq通用扩展方法-字符串作为键选择器

本文关键字:选择器 字符串 扩展 方法 DbLinq | 更新日期: 2023-09-27 18:02:50

下面的代码片段表明了我想要的:

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(显然是一个整数),我想知道最大Id。

谁知道我怎么能得到我的片段工作??

谢谢!


我找到了这篇文章:order 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
    );
}

但是现在我得到一个错误:

Value不能为空。参数名称:key

DbLinq通用扩展方法-字符串作为键选择器

不确定,但试试

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

EDIT -如果您需要将Id作为字符串放入表达式:

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

EDIT -如果你需要分割:

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

好了,我明白了!

    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部分的提示!