Linq to SQL лямбда-соединение - PullRequest
8 голосов
/ 28 марта 2011

Возникли проблемы с этим, я попытался следовать нескольким примерам, но я просто не понимаю. Это имеет смысл, используя не лямбда-способ, но как мне сделать соединение, используя лямбда-выражения?

var myCats = GetAllCats();
var myHouses = GetAllHouses();

// pseudosql:  select * from a inner join b on a.id = b.id

Я пробовал это:

var fullData = myCats.Join(myHouses, a => a.id, b => b.id, (a, b) => a);

, который я вроде как просматривал в других примерах SO, но fullData имеет тип IEnumerable<Cat>, поэтому я не могу извлечь из него никакие свойства.

Ответы [ 4 ]

30 голосов
/ 28 марта 2011
var fullData = myCats.Join(
                 myHouses, 
                 cat => cat.id, 
                 house => house.id, 
                 (cat, house) => 
                   new 
                   { 
                     Cat = cat, 
                     House = house 
                   });

Доступ через fullData.First().Cat... или fullData.First().House....

6 голосов
/ 28 марта 2011

Проблема в том, что результат вашего соединения - последний параметр метода Join - это Cat, поэтому fullData имеет тип IEnumerable<Cat>.Если вы хотите получить доступ к обоим, верните анонимный тип:

var fullData = myCats.Join(myHouses, a => a.id, 
                                     b => b.id,
                                     (a, b) => new { Cat = a, House = b});
5 голосов
/ 28 марта 2011

Вам нужно определить, что именно вы хотите выбрать из них.

Вы можете изменить свой последний на:

var fullData = myCats.Join(myHouses, cat => cat.id, house => house.id, (cat, house) => new {cat, house})

, что сделает fullData IQueryable анонимного типа, который выглядит следующим образом:

class anonymous
{
  Cat cat,
  House house
}

Эквивалент в формате LINQy:

from cat in myCats join house in myHouses
  on cat.id equals house.id
  select new {cat, house}

Вы также можете указать, что вы хотите выбрать, чтобы избежать потерь:

from cat in myCats join house in myHouses
  on cat.id equals house.id
  select new {cat.id, cat.name, house.address}
5 голосов
/ 28 марта 2011

Это потому, что последний аргумент (a, b) => a означает отображение результата возврата только для кошек, то есть это (cat, house) => cat

Вы можете вернуть временный объект с парой, например,

(cat, house) => new { cat, house }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...