2013-03-26 95 views
0

當通過實體框架訪問數據庫我有三個可用的實體:LINQ:過濾子對象

  • stt_dictionary
  • stt_concept
  • stt_term

每個實體具有收藏第四個實體stt_change_log。

因此,例如,

stt_dictionary.stt_change_log = ICollection<stt_change_log> 

那些頂部3元件和stt_change_log之間的關係是

stt_change_log.element_id = (stt_dictionary | stt_concept | stt_term).id; 

然而,如stt_dictionary,stt_concept和stt_term都有INT作爲它們的ID類型,還需要以下內容:

stt_change_log.element_type_id = (7 | 8 | 9) 

現在,當我運行下面的查詢語句時,它會返回所有具有指定ID的stt_change_log實體,這意味着如果我想在stt_dictionary.id = 1時需要stt_change_log實體,則還會獲得stt_change_log條目,這些條目屬於stt_concept和stt_term實體ID也= 1。換句話說,stt_change_log集合需要額外的過濾。

var daoDictionary = (from d in db.stt_dictionary 
         .Include("stt_change_log.stt_change_types") 
        where d.id == id 
        select d).FirstOrDefault(); 

我怎麼能由stt_change_log集合中的element_type_id財產指定爲每個項目的值過濾stt_change_log實體?

我還會補充一點,我的意圖是在單個查詢中執行此操作。

回答

1

不幸的是,包括不允許過濾。

您可以use a projection執行篩選服務器大小,或者您可以根據需要延遲加載項目。

您也可以vote for that feature未來包括在內。

+0

感謝您的快速響應,埃裏克。我其實並不需要第一個。包括聲明,因爲該級別的兒童由一個協會填充。但是,即使stt_change_log和stt_change_types之間存在關聯,stt_change_log也是如此。stt_change_type屬性不會自動填充(我不知道爲什麼)。 因此,因爲.Include語句僅用於下一級(不是我想要篩選的級別),所以這對我有利嗎?這是否意味着*有*我可以在stt_change_log集合上做的事情? – awj 2013-03-26 17:39:05

1

您的最佳選擇是使用逐層(TBH)繼承映射爲您的日誌實體。您將定義一個基本實體stt_change_log,然後爲每種類型的日誌派生一個實體類。 stt_change_type將是鑑別器。

然後每個「主」實體將引用特定於該實體和過濾神奇地爲你做的日誌類型;)

閱讀下面的教程開始:

http://msdn.microsoft.com/en-us/data/jj618292

請注意,在您的情況下,您不需要派生實體中的任何其他屬性。如果您先使用代碼,請先搜索「逐層代碼」;這裏有一個快速準備:http://blogs.msdn.com/b/wriju/archive/2011/05/17/code-first-ef-4-1-table-per-hierarchy.aspx

+0

TPH繼承確實看起來正是我所需要的。但花了大約3個小時後,我無法實現它 - 太多的構建錯誤。我在你的第一個鏈接(我沒有使用Code First)中跟着這個例子,但是在這個例子中使用的模型和我的模型之間的區別在於我的聯繫更多。具體來說,它告訴我標記爲抽象(和繼承)的實體上存在關聯,並且一旦從stt_change_log實體繼承了新實體,那些關聯就不再有效。可惜,TPH看起來非常有用。 – awj 2013-03-27 10:42:06