2009-10-20 35 views
0

這在SQL中很容易實現,我很難用Linq to SQL實現這一點。我有兩個實體的建立,項目和ProjectsbyUser:如何根據另一個實體過濾實體? Linq多對多C#

[Table(Name = "Projects")] 
public class Project 
{ 
    [Column(IsPrimaryKey = true, IsDbGenerated = true, Name="Job")] 
    public string ProjectId { get; set; } 
    [Column(Name = "Description")] 
    public string Description { get; set; }   

    [Association(OtherKey = "ProjectId")] 
    private EntitySet<ProjectList> _projectlist = new EntitySet<ProjectList>(); 
    public IEnumerable<ProjectList> ProjectList { get { return _projectlist; } } 
} 

[Table(Name = "ProjectLists")] 
public class ProjectList 
{ 
    [Column(IsPrimaryKey = true)] 
    public string UserId { get; set; } 
    [Column(IsPrimaryKey = true)] 
    public string ProjectId { get; set; } 
} 

所以在我ProjectsController我也會有這樣的:

public ViewResult myProject() 
    { 
     var query = projectsRepository.Projects 
         .Where(x => x.ProjectId == "H1000").ToList(); 
     return View(query.ToList()); 
    } 

哎,你怎麼知道,它會顯示所有連接到用戶項目H1000與我的觀點內嵌幾個很好的嵌套的foreach語句。儘可能簡單,但我試圖根據用戶進行過濾。我可以讓用戶足夠簡單(與UserId列匹配的User.Identity.Name.ToString())。這很容易做到,但我沒有想出一個方法來完成它,而不寫出可怕的代碼。這個blog post解釋了我想要做的事情,但它似乎使用「Linq to SQL classes」模板,現在我的實體坐在漂亮的C#類文件中,而不是在VS2008華麗的GUI設計器文件中。必須有一個優雅的方式來解決這個問題,我已經爲此工作了大約一週,並認爲我可能會讓自己陷入一個角落。謝謝你的幫助!

回答

0

這是否做你所需要的?

projectsRepository.Projects 
    .Where(x1 => x1.ProjectId == "H1000" && 
     x1.ProjectList.Any(x2 => x2.UserId == User.Identity.Name.ToString())) 
    .ToList() 
1

旁註:你正在做ToList()兩次,這是沒有必要的:)

回答你的問題:

創建ProjectList和項目之間的家長協會,使每個ProjectList項目有一個名爲「項目」(或任何你想調用它)的屬性。

然後,就這樣做:

string userId = User.Identity.Name.ToString(); 
var query = projectsRepository.ProjectLists.Where(pl => pl.UserId == userId).Select(pl => pl.Project); 

......然後砰一聲,你有項目,該用戶的列表。

編輯:另一個解決方案張貼在兒童關係上的作品也將工作,但在我看來這是更清潔,如果你剖析查詢,它實際上是更有效的。另一種解決方案最終在內部進行昂貴的連接。

0
string userID = User.Identity.Name.ToString(); 
var query = from p in repository.Projects 
     from pl in p.ProjectList 
     where pl.UserID = userID 
     select p; 

也許這種方式是最具可讀性的。

0

我想我問這個問題是一個未註冊的用戶,似乎無法登錄並正確標記最佳答案。爲了後人邁克·瑪洛諾夫斯基的方法工作得很好,並避免了我試圖避免的不必要的連接。唯一的代碼,我加入到MyProject的實體:

[Association(ThisKey = "ProjectId")] 
public Project Project { get; set; } 

根據SQL事件探查器運行非常有效,僅拉動需要什麼(我猜是那種一點,但我仍然感到驚訝它不生成凌亂的TSQL語句)。 Misha的方法看起來也可以工作,但我更喜歡Mike的「Lambda表達式」和「反向SQL」語句的風格。它看起來很錯,但我一直在寫TSQL。