2011-02-09 47 views
1

不知道如何完成此操作,我設置了.edmx以便導航屬性與表上的外鍵關係匹配。不知道是否仍然需要執行連接,或者如果EF會自動通過導航屬性訪問相關表格數據。實體框架4 Linq幫助 - 從多個表中提取數據已過濾

enter image description here

我需要做的是得到一個基於內容查看並通過DiversionProgram.CrimeNumber過濾所有ContentSections及其相關ContentItems。

我想找回的IEnumerable,每個ContentSection應該可以訪問它通過導航屬性ContentItems是ContentItems

感謝

+1

你建立一個CRIM inal網絡?我可以參加嗎? ;) – 2011-02-09 20:49:58

+1

確定很容易加入...找到你當地的警察,並給他一個大耳光,你會立即成爲網絡的一部分!在使用示例時,LOL – JBeckton 2011-02-09 20:59:41

回答

0

喜歡的東西:

using(Entities context = new Entities()) 
{ 
    IEnumerable<ContentSection> enumerator = context.ContentSections 
    .Include("ContentItems") 
    .Where<ContentSection>(cs => cs.ContentView.ContentViewID == someID && cs.ContentItems.Where<ContentItem>(ci => ci.DiversionProgram.CrimeNumber == someCrimeNumber)) 
    .AsEnumerable<ContentSection> 
} 

我解釋

基於ContentView

cs.ContentView.ContentViewID == someID

這會給你一個給定的內容查看所有的ContentSections。並解釋

由DiversionProgram.CrimeNumber

過濾爲cs.ContentItems.Where<ContentItem>(ci => ci.DiversionProgram.CrimeNumber == someCrimeNumber)

,這將給你所有那些具有特定CrimeNumber ContentItems。

或者你的意思是基於/過濾的其他內容。也許OrderBy,或所有那些ContentItem的任何它的ContentItems將有一個CrimeNumber?

+0

出現錯誤無法將運算符'&&'應用於bool和IEnumerable類型的操作數。 – JBeckton 2011-02-09 21:49:40

0

您可以急切加載獲得全部相關記錄,但是當您想要開始過濾/排序時,請不要打擾Include

只需使用匿名類型進行投影,EF就會計算出需要執行的操作。這有點多毛,但它會工作。如果它太複雜,請咬緊牙關並使用SPROC。現在

,與告誡,像這樣(把我的頭頂部):

var query = ctx.ContentView 
       .Select(x => new 
{ 
    ContentSections = x.ContentSections 
         .Where(y => y.ContentItems 
         .Any(z => z.DivisionProgram.CrimeNumber = 87)) 
}).ToList().Select(x => x.ContentSections); 
0

如果使用CTP5你可以做一些非常獨特的,它看起來像這樣:

var context = new YourEntitiesContext(); 

var query = context.ContentView.Include(cs => cs.ContentSections 
        .Select(ci => ci.ContentItems 
        .Select(dp => dp.DiversionProgram) 
        .Where(dp.CrimeNumber == crimeNumber))) 
        .Where(cv => cv.ContentViewID == contentViewID).FirtsOrDefault(); 

您可以瞭解更多有關CTP5以及它如何在數據庫中第一個方案中使用here

0
var query = from t1 in studentManagementEntities.StudentRegistrations 
         join t2 in studentManagementEntities.StudentMarks 
         on t1.StudentID equals t2.StudentID 
         select new 
         { 
          t1.selected column name, 
          t2.selected column name 
         };