[英]DbLinq generic extension method - string as keyselector?
以下代碼段表明我想要什么:
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。 參數名稱:key
不確定但試試
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));
好吧,我想通了!!
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 部分的提示!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.