2011-01-07 35 views
0

我想實現一個泛型類,將與一個通用的存儲庫進行交互,除了當我不得不處理從存儲庫獲取對象時,一切都很好。如何在使用泛型類時通過PK查詢EF?

我將在通用類中有一個虛擬方法,它將收到一個int,並且我想用這個int來形成一個對存儲庫的查詢,通過它們的主鍵獲取對象。我有一種感覺,我需要在EF中使用EntityKey屬性,但不太確定。

無論如何,這裏就是我想要的代碼做的,我希望有人會對如何來完成我想建議:

public virtual T Get(int PrimaryKey) { 
    this.Repository.Select(
     t => 
      (t.PRIMARYKEY == PrimaryKey)).Single(); 
} 

我要擴展這個類提供更專業化的類,但因爲他們大多數只通過查詢PK來獲得他們的對象,這使我有一個基本的方法可以做到這一點。

在此先感謝您的任何建議!

UPDATE

所以,這裏的地方我已經得到了反映,我懷疑它的正確方法,但有些作品...我收到該消息LINQ一個NotSupportedException到實體無法識別方法'System.Object GetValue(System.Object,System.Object [])'方法,並且此方法無法轉換爲存儲表達式。。雖然我明白它說什麼和爲什麼它說,我不知道如何在我的代碼看起來像這樣克服:

private readonly string TEntityName = typeof(T).Name; 

public virtual T Get(
    int PrimaryKey) { 
    return this.Repository.Select(
     t => 
      (((int)t.GetType().GetProperties().Single(
       p => 
        (p.Name == (this.TEntityName + "Id"))).GetValue(t, null)) == PrimaryKey)).Single(); 
} 

希望有人誰知道如何使用反射,不像我,可以點我在正確的方向。謝謝!

回答

1

檢索通過使用EF一個PK的實體需要表達/謂詞,像這樣:

Expression<Func<Order,bool>> predicate = x => x.OrderId == 1; 
return ctx.Orders.Single(predicate); 

沒有要能夠動態地創建該謂詞簡單的方法(短反射或表達式樹創建的) 。

你可以做的是接受謂詞作爲參數:

public virtual T Get(Expression<Func<T,bool>> predicate) { 
    this.Repository.Select(predicate).Single(); 
} 

另外,還要確保你把一些通用的制約T(無論是在類/方法級)。

+0

Hi @ RPM1984,很高興再次見到你!我正在考慮通過一個表達式,但我想稍微刪除這個要求。例如,我的應用程序分層爲:`Supervisor` - >`Provider` - >`Repository`。這是我試圖推廣的'提供者'。有了一個表達式(即使是簡單解決方案),我必須在「Supervisor」層中完成它,並將它傳遞給「Repository」。最後會有很多重複,這是我想嘗試和避免的。我認爲反射可能會出現,但不知道反映了什麼... – Gup3rSuR4c 2011-01-08 01:23:19