首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DbLinq泛型扩展方法-字符串作为键选择器?

DbLinq泛型扩展方法-字符串作为键选择器?
EN

Stack Overflow用户
提问于 2011-07-20 20:40:13
回答 2查看 857关注 0票数 1

下面的片段表示我想要的内容:

代码语言:javascript
复制
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。

有谁知道我怎样才能让我的片段发挥作用吗?

,谢谢!

我找到了这篇文章:OrderBy with a String keySelector

有了这个建议,我的代码将变成:

代码语言:javascript
复制
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
    );
}

但现在我发现了一个错误:

值不能为空。参数名称:键

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-07-21 08:41:25

好吧,我想通了!!

代码语言:javascript
复制
    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部分的提示!

票数 1
EN

Stack Overflow用户

发布于 2011-07-20 21:08:55

不确定,但试一下

代码语言:javascript
复制
var Result = from x in table select x.Max ( x => x.Id );

编辑-如果需要将Id作为字符串输入表达式:

代码语言:javascript
复制
var Result = from x in table select x.Max ( x => x.GetType().GetProperty ("Id").GetGetMethod().Invoke (x, null) );

编辑-如果您需要拆分:

代码语言:javascript
复制
var Result1 = from x in table select x; var Result2 = Result1.Max(x => x.GetType().GetProperty("Id").GetGetMethod().Invoke(x, null)); 

编辑-如果"Id“是一个字段,那么您需要以下内容:

代码语言:javascript
复制
var Result1 = from x in table select x; 
var Result2 = Result1.Max(x => x.GetType().GetField ( "Id" ).GetValue(x));
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6768248

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档