Вы получаете книги, потому что вы указали это в своем Join
утверждении с окончательным селектором => b
.Вы хотите выбрать оба, поэтому используйте это:
var query = webshopDB.Books.Join(webshopDB.InventoryDetails,
b => b.BookId, i => i.BookId,
(b, i) => new { Book = b, InventoryDetail = i });
Затем, когда вы перебираете результаты, вы можете использовать:
foreach (var item in query)
{
Console.WriteLine(item.Book.SomeProperty);
Console.WriteLine(item.InventoryDetail.SomeProperty);
}
Другая проблема с вашим методом заключается в том, что тип возвращаемого значенияэто List<Book>
.Таким образом, вышеприведенное не будет работать, поскольку класс Book
отделен от класса InventoryDetail
.Вам необходимо настроить новый класс, включающий оба, или использовать Tuple<Book, InventoryDetail>
при использовании .NET 4.0.
Чтобы вернуть определенное свойство, вы можете изменить инструкцию на:
var query = webshopDB.Books.Join(webshopDB.InventoryDetails,
b => b.BookId, i => i.BookId,
(b, i) => new { b.BookId, i.Quantity });
Опять же, вам нужен соответствующий тип возврата, если вы возвращаете List<T>
.
EDIT: чтобы получить Dictionary<Book, InventoryDetail>
, вы можете использовать более ранний запрос следующим образом:
var query = webshopDB.Books.Join(webshopDB.InventoryDetails,
b => b.BookId, i => i.BookId,
(b, i) => new { Book = b, InventoryDetail = i })
.ToDictionary(o => o.Book, o => o.InventoryDetail);
Конечно, вы можете использовать Where
и Take
по мере необходимости перед вызовом ToDictionary
.Вы также можете проецировать только те свойства, которые вам нужны, как запрос непосредственно перед этим.Вам необходимо спроецировать его в анонимный тип с помощью ключевого слова new
(раньше оно отсутствовало, поэтому взгляните на него еще раз).