2016-10-12 93 views
1

有沒有什麼辦法可以傳入一個通用的實體對象並獲得其查詢中的第一個元素。如何獲取動態/泛型類型的第一個元素

我的意圖是在每個表上調用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

在這個例子中'db'是什麼?一個EF DbContext? – rmorrin

+0

是的,對不起。這是我的實體環境 – Doomsknight

回答

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)。

也許這只是一個工作的例子,但值得指出的是,在靜態幫助器方法中定義這種邏輯通常是不可取的。如果你想沿着這條路線走下去,我會建議研究'通用庫模式',這將更加可維護。

+0

這很好。我曾嘗試使用Set,但沒有正常工作。 – Doomsknight

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

謝謝,它不適用於我沒有'where TEntity:class'作爲其他答案。用於指示'Set'的+1。 – Doomsknight

+0

@Doomsknight,不客氣。我很高興你的問題解決了。我會編輯我的答案。 –