EF自定义选择与实体属性作为参数

时间:2017-09-07 08:43:06

标签: entity-framework linq

对于每个表(我有很多表),我在ASP.Net Core应用程序中提供了Lookup REST API方法。

这是我对每个表的查询的一部分:

    context.Users.Select(t => new ViewLookupModel()
    {
        id = t.Id,
        title = t.DisplayName
    })
    //......
    context.Groups.Select(t => new ViewLookupModel()
    {
        id = t.Id,
        title = t.Name
    })

但我想编写扩展来缩小我需要为每个表编写的代码。像这样:

        public static IQueryable<ViewLookupModel> SelectLookup<T>(this IQueryable<T> query, Func<int> idField, Func<string> titleField)
        {
            return query.Select(t => new ViewLookupModel()
            {
                id = idField(),
                title = titleField()
            });
        }

用例:

context.Users.SelectLookup(t => t.Id, t => t.DisplayName)
//......
context.Groups.SelectLookup(t => t.Id, t => t.Title)

但我得到错误:

  

委托'Func'不带1个参数。

Thisthis问题似乎相似,但我无法让它发挥作用。

在使用自定义SELECT扩展方法查询数据库时,我对任何性能问题都很感兴趣。

1 个答案:

答案 0 :(得分:1)

将您的扩展方法更改为此并尝试。 Extension方法将T作为输入并返回相应的int或string等。

public static IQueryable<ViewLookupModel> SelectLookup<T>(this IQueryable<T> query, Func<T,int> idField, Func<T,string> titleField)
    {
        return query.Select(t => new ViewLookupModel()
        {
            id = idField(t),
            title = titleField(t)
        });
    }