簡體   English   中英

LINQ:過濾子對象

[英]LINQ: filter child objects

通過實體框架訪問數據庫時,我有三個實體可用:

  • stt_dictionary
  • stt_concept
  • stt_term

這些實體中的每一個都具有第四實體stt_change_log的集合。

所以,例如,

stt_dictionary.stt_change_log = ICollection<stt_change_log>

前三個元素和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_concept和stt_term實體相關的stt_change_log條目,其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實體?

我還要補充一點,我的目的是在一個查詢中執行此操作。

不幸的是.Include不允許過濾。

您可以使用投影來執行過濾服務器大小,也可以根據需要延遲加載項目。

您還可以投票支持將來包含該功能

您最好的選擇是為您的日志實體使用逐層(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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM