2015-12-14 51 views
0

我的模型...(fyi「應用程序」在工作申請中和「管理員」在一個人中已分配給該應用程序的責任)多對多EF6查詢...嘗試獲取屬於實體A的實體B幷包含所有實體作爲

public class Application 
{ 
    public int Id { get; set; } 
    public string Title { get; set; } 

    public ICollection<Administrator> Administrators { get; set; } 
} 

public class Administrator 
{ 
    public int Id { get; set; } 
    public string Username { get; set; } 

    public ICollection<Application> Applications { get; set; } 
} 

注意多到任何應用程序和管理人員之間的關係。

其內部網應用程序和用戶(誰也將是一個或多個應用程序管理員)將被識別使用Windows身份驗證。我想返回JSON,僅針對用戶是管理員的應用程序,但也包括e這些應用程序的所有管理員。例如,John創建了一個名爲「兒科診所護士從業人員」的新應用程序,該應用程序使約翰自動成爲該應用程序的管理員,但約翰還分配了貝蒂作爲該應用程序的管理員。貝蒂不是任何其他應用程序的管理員。她應該得到名爲「兒科診所護士從業人員」的應用程序對象,以及該應用程序的兩名管理員(約翰和貝蒂)。

這工作,但包括所有不限於貝蒂的應用...

context.Applications.Include("Administrators").ToList(); 

這些工作,但顯然不是我想要的......

context.Administrators.Include("Applications").ToList(); 
context.Applications.Include("Administrators").Where(a => a.Id.Equals(1)).ToList(); 
context.Administrators.ToList(); 
context.Administrators.Find(1); 

這不工作...

context.Applications.Include("Administrators").Where(a => a.Administrators.Contains(context.Administrators.First())).ToList(); 

Get ...

An exception of type 'System.NotSupportedException' occurred in EntityFramework.SqlServer.dll but was not handled in user code 
Additional information: The method 'First' can only be used as a final query operation. Consider using the method 'FirstOrDefault' in this instance instead. 

這不工作...

context.Administrators.Find(1).Applications.ToList(); 

得到...

An exception of type 'System.ArgumentNullException' occurred in System.Core.dll but was not handled in user code 
Additional information: Value cannot be null. 

雖然我知道ID爲管理員= 1有2個應用程序。

這工作...

(from app in context.Applications 
         from admin in app.Administrators 
         where admin.Username == 「John" 
         select app).ToList(); 

但不包括管理員,如果我加入一個這樣的包括()子句...

(from app in context.Applications 
         from admin in app.Administrators 
         where admin.Username == 「John" 
         select app).Include(「Administrators」).ToList(); 

這是行不通的。

無法弄清楚。任何幫助將非常感激。謝謝。

回答

0

想通了自己...

// get the current user's id 
var userId = 1; 
var apps = (from Application app in context.Applications.Include("Administrators") 
         where app.Administrators.Select(a => a.Id).Contains(userId) 
         select app).ToList();