是否有任何方法可以传入通用实体对象并获取其查询中的第一个。
我的目的是在每个表上调用FirstOrDefault()
,并尝试捕获数据库完整性中的错误。
能够通过字符串参数调用它会更好,例如db.Entity("myTable").FirstOrDefault()
但这种方法似乎不存在。
下面是一些通用的T
尝试,但我得到的对象没有设置为实例错误。
// Called with
//GetFirstObject<myTable>(db.myTable);
public static void GetFirstObject<T>(object obj)
{
MethodInfo method = typeof(IEnumerable<T>).GetMethod("FirstOrDefault");
MethodInfo generic = method.MakeGenericMethod();
generic.Invoke(obj, null);
}
答案 0 :(得分:2)
为什么不使用Set<T>()
?
public T GetFirstObject<T>()
where T : class
{
return context.Set<T>().FirstOrDefault();
}
您还可以传递过滤器表达式:
public T GetFirstObject<T>(Expression<Func<T, bool>> filterExpression)
where T : class
{
return context.Set<T>().FirstOrDefault(filterExpression);
}
答案 1 :(得分:1)
假设TEntity
是代表您的域实体的类,您可以尝试以下操作:
// Called with
// GetFirstObject<myTable>(db);
public static TEntity GetFirstObject<TEntity>(DbContext context) where TEntity : class
{
return context.Set<TEntity>().FirstOrDefault();
}
context.Set<TEntity>()
将返回代表 TEntity
数据库表的集合。从那里,您可以使用LINQ定义的任何常规IQueryable扩展(在本例中为FirstOrDefault
)。
也许它只是一个有效的例子,但值得指出的是,在静态辅助方法中定义这种逻辑通常是不可取的。我建议研究一下通用存储库模式&#39;如果你想沿着这条路走下去,这将更加可维护。