EF1 SelectMany () осталось присоединиться - PullRequest
6 голосов
/ 04 ноября 2011

Можно ли использовать SelectMany () и он ведет себя как левое соединение?

Я пытаюсь свести объект сущности в табличный формат, чтобы я мог использовать его в качестве источника данных для отчета .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 }));
    }

Это заставит владельцев AndPets выглядеть так:
ownerName = "Ricky", petName = "Smudge"
ownerName = "Ricky", petName = "Spot"

Что мне нужно, это:
ownerName = "Bobby", petName = null
ownerName = "Ricky", petName = "Smudge"
ownerName = "Ricky", petName = "Spot"

1 Ответ

9 голосов
/ 11 октября 2012

Убедитесь, что набор данных является перечисляемым, а затем используйте «DefaultIfEmpty».

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

ПРИМЕЧАНИЕ. Я не тестировал этот конкретный фрагмент кода, но использовал его раньше, поэтому знаю, что это можно сделать.

...