如何获取动态/泛型类型的第一个元素

时间:2016-10-12 11:07:55

标签: c# entity-framework dynamic entity-framework-6

是否有任何方法可以传入通用实体对象并获取其查询中的第一个。

我的目的是在每个表上调用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);            
    }

2 个答案:

答案 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;如果你想沿着这条路走下去,这将更加可维护。