我有多个具有相同结构的表,并且想要编写一个从正确的表中返回数据的泛型函数。
现在:
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获得正确的表格。
答案 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);