2016-10-26 76 views
-3

多個集合我有具有許多collectionsLINQ的SelectMany從基部同一實體

public class Person 
{ 
public int id {get; set;} 
    public ICollection<Address> Address {get; set;} 
    public ICollection<Job> Job {get; set;} 
} 

    public class Adress 
    { 
    public bool IsCurrent {get; set;} 
    } 
public class Job 
    { 
    public bool IsCurrent {get; set;} 
    } 

一個人可以具有list of addresses但只有一個是電流和list of Jobs但只有一個是當前的對象。

我需要編寫一個linq to sql實體框架查詢,我在哪裏選擇Id= 1並獲得current job and current address的人。

然後選擇然後從person, current address and current job中選擇一些字段。

+2

你能證明你試過了嗎? –

+1

你的模型不完整,你提供的小代碼沒有真正的幫助,甚至不會編譯,你也沒有嘗試去解決你自己的問題。 – Igor

+1

是的,您還應該顯示作業和地址實體。 – jorgonor

回答

3

假設JobAddress有一個布爾字段IsCurrent

using (YourDbContext context = new YourDbContext()) { 
    int id = 1; 
    var results = (from person in context.People 
        where person.Id == id 
        select new { 
         Person = person, 
         CurrentJob = person.Job.FirstOrDefault(j => j.IsCurrent), 
         CurrentAddress = person.Address.FirstOrDefault(a => a.IsCurrent) 
        }); 
}    

您可以將匿名對象更改爲適合您的任何內容。

+0

良好的解決方案,有限的信息可用 –

+0

是的,多一點信息將是有價值的,但我想工作和地址實體必須有一個布爾標誌或類似的東西,這是通常的方式:) – jorgonor

+0

@jorgonor - 只是一點改進 - 用'FirstOrDefault'和謂詞代替'Where()。FirstOrDefault'並且謂詞 –

0

正如我喜歡lambda syntax,這裏有雲:

using (DbContext context = new DbContext()) 
{ 
    var p = context.People.FirstOrDefault(local => local.Id == 1); 

    var result = new { Person = p, CurrentJob = p.Job.FirstOrDefault(j => j.IsCurrent),CurrentAddress = person.Address.FirstOrDefault(a => a.IsCurrent)}; 
} 

從接受的解決方案重要的區別是:

  1. 後申請Where(p => p.Id = 1),預計集合中只有一個人,作爲Id將是唯一的
  2. 而不是Select使用FirstOrDefault得到的結果爲Person而不是由一個記錄組成的IEnumerable<Person>
+0

這不工作的朋友 - 'FirstOrDefault'可以代替'Where',而不是'Select'。 –

+1

@IvanStoev更正,感謝指出,這是發生了什麼,當Linq直接寫在基於SO的想象上,而不是在Linqpad或VS上測試的時候,還有其他愚蠢的錯誤:) –