2011-11-04 67 views
2

是否可以使用SelectMany()並使其表現得像一個左連接?EF1 SelectMany()left join

我想將實體對象變成表格格式,以便我可以將它用作.rdlc報表的數據源。只要存在子對象,SelectMany()就像一個魅力一樣,但我希望看到所有的父對象,不管它是否有子對象。

public class Owner 
{ 
    public int ownerID { get; set; } 
    public string ownerName { get; set; } 
    public List<Pet> pets { get; set; } 
} 

public class Pet 
{ 
    public int petID { get; set; } 
    public string petName { get; set; } 
    public string petType { get; set; } 
} 

    public void GetOwners() 
    { 
     List<Owner> owners = new List<Owner>(); 
     owners.Add(new Owner{ownerID=1, ownerName="Bobby", pets = null}); 
     owners.Add(new Owner 
     { 
      ownerID = 2, 
      ownerName = "Ricky", 
      pets = new List<Pet>(){ 
       new Pet{petID=1, petName="Smudge", petType="Cat"}, 
       new Pet{petID=2, petName="Spot", petType="Dog"}} 
     }); 

     var ownersAndPets = owners.SelectMany(o => o.pets 
      .Select(p => new { o.ownerName, p.petName })); 
    } 

這將使ownersAndPets樣子:
OWNERNAME = 「瑞奇」,petName = 「塗抹」
OWNERNAME = 「瑞奇」,petName = 「點」

我需要的是:
OWNERNAME = 「鮑勃」,petName = NULL
OWNERNAME = 「瑞奇」,petName = 「塗抹」
OWNERNAME = 「瑞奇」,petName = 「點」

+0

我想我剛剛意識到這是不可能的,因爲孩子的屬性都必須是可空的。如果您嘗試將p.petID拉入匿名類型,您將得到一個空例外。啊。 – Eclipse

回答

6

確保數據集是可枚舉的,然後使用「DefaultIfEmpty」。

 var ownersAndPets = owners 
     .SelectMany(o => o.pets 
      .DefaultIfEmpty() 
      .Select(p => new 
      { 
       o.ownerName, 
       p.petName 
      })); 

注意:我沒有測試這段代碼,但我之前使用過這個,所以我知道它可以完成。