LINQ запрос с объединением - PullRequest
       0

LINQ запрос с объединением

1 голос
/ 11 августа 2011

Я не могу подготовить запрос, который мне нужен.У меня есть код:

public class Dog
{
    public int id;
    public int? OwnerID;
    public string name;
}

public class Person
{
    public int id;
    public string Name; 
}

public class Group
{
    public Dog dog;
    public Person owner;
}
class Program
{
    static void Main(string[] args)
    {
        IEnumerable<Dog> dogs = new[] { 
                                        new Dog { id = 1, OwnerID = null, name = "Burke" }, 
                                        new Dog { id = 2, OwnerID = 2, name = "Barkley" } 
                                      };
        IEnumerable<Person> owners = new[] { 
                                               new Person { id = 1, Name = "Jack" },
                                               new Person { id = 2, Name = "Philip" }
                                            };

        var groups = from dog in dogs
                     join owner in owners on dog.OwnerID equals owner.id
                     select new Group
                     {
                         dog = dogs.First(d => d.id == dog.id),
                         owner = owners.First(o => o.id == owner.id)
                     };
        foreach (var g in groups)
        {
            var text = g.dog.name + " belongs to " + (g.owner == null ? "no one" : g.owner.Name);
            Console.WriteLine(text);
        }
        Console.ReadLine();
    }
}

, и он не работает, как я ожидал.Как подготовить запрос о том, что даже если OwnerID в объекте Dog равен null, новый экземпляр Group все еще создается и добавляется в переменную groups?

Ответы [ 2 ]

3 голосов
/ 11 августа 2011

Как и так

var groups = from dog in dogs
join owner in owners on dog.OwnerID equals owner.id
from own in owner.DefaultIfEmpty()
select new Group
{
  dog = dogs.First(d => d.id == dog.id),
  owner = own.First(o => o.id == owner.id)
};

См. http://smehrozalam.wordpress.com/2009/06/10/c-left-outer-joins-with-linq/

Хотя его примеры показывают перевод на SQL, то же самое относится и к linq для объектов

1 голос
/ 11 августа 2011

Из того, что вы описываете, звучит так, как будто вы хотите выполнить запрос Left Outer Join для Dogs.Посмотрите этот пример из примеров LINQ от Microsoft о том, как использовать функцию DefaultIfEmpty() LINQ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...