多个db表的通用方法

时间:2015-10-23 11:33:14

标签: c# .net entity-framework

我有多个具有相同结构的表,并且想要编写一个从正确的表中返回数据的泛型函数。

现在:

var a = context.TableA.Where(a => a.id == id).FirstOrDefault.Name;
var b = context.TableB.Where(b => b.id == id).FirstOrDefault.Name;

我想要这样的事情:

var a = GetName<TableA>(id);
var b = GetName<TableB>(id);

GetName<T>(int id){
 //right table
 return context<T>.Where(x => x.id == id).FirstOrDefault.Name;
}

但是我无法通过泛型T获得正确的表格。

3 个答案:

答案 0 :(得分:1)

尝试类似:

context.Set(typeof(T)).Where(a => a.id == id).FirstOrDefault.Name;

T应该限制ID。

答案 1 :(得分:1)

如果不获取context,则无法执行此操作,因此,您可以添加另一个类,将上下文作为构造函数的参数传递给它,将其保存到私有字段并在其中定义GetName方法。像这样:

public class EntityHelper
{
    private readonly DbContext _context;
    public EntityHelper(DbContext context)
    {
        this._context = context;
    }

    public string GetName<T>(int id)
    {
        return this._context.Set<T>().Where(x => x.id == id).FirstOrDefault().Name;
    }
}
方法GetName

应该有约束,因为编译器不知道T是否具有名为Name的属性

我还建议您将FirstOrDefault()更改为First(),因为如果您要访问FirstOrDefault()结果的属性,当它返回null时 - 您将获得{{} 1}}

答案 2 :(得分:0)

您可以使用以下帮助程序(不需要更改您的类)

public static class Utils
{
    public static string GetName<T>(this DbContext db, int id)
        where T : class
    {
        var source = Expression.Parameter(typeof(T), "source");
        var idFilter = Expression.Lambda<Func<T, bool>>(
            Expression.Equal(Expression.Property(source, "id"), Expression.Constant(id)),
            source);
        var nameSelector = Expression.Lambda<Func<T, string>>(
            Expression.Property(source, "Name"),
            source);
        return db.Set<T>().Where(idFilter).Select(nameSelector).FirstOrDefault();
    }
}
像这样

var a = context.GetName<TableA>(id);
var b = context.GetName<TableB>(id);