[英]LINQ: filter child objects
通過實體框架訪問數據庫時,我有三個實體可用:
這些實體中的每一個都具有第四實體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實體?
我還要補充一點,我的目的是在一個查詢中執行此操作。
您最好的選擇是為您的日志實體使用逐層(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.