Linq to Entities, возвращающие все внешние сущности и одну или ни одной связанной сущности - PullRequest
1 голос
/ 22 июня 2011

Я использую LinqPad с моделью Entity Framework 4 и базой данных MS SQL 2008.

Предположим, у нас есть объект «Клиент», который связан с «Покупкой» с внешним ключом для Customer.CustomerID.

Следующий linq создает ObjectQuery<Customer> с Purchases ассоциацией EntityCollection<Purchase>.

from c in Customers.Include("Purchases")
select c

Теперь я хочу получить всех клиентов только с самой последней покупкой.Если нет покупки, тогда я хочу, чтобы коллекция Purchases была пустой.

Мне нужно что-то вроде следующего, но это поддерживает сущность и связь.Я хочу получить всех клиентов с коллекцией, ограниченной 0 или 1 покупками.

from c in Customers
from p in c.Purchases.Where(p => p.PurchaseDate == c.Purchases.Max(m => m.PurchaseDate).DefaultIfEmpty()
select new { CustomerID = c.CustomerID, PurchaseID = (int?)p.PurchaseID }

В моем сервисе я возвращаю List<Customer>, поэтому я думаю, что мне нужно поддерживатьCustomer сущность и Purchases связь в возврате из запроса linq.

Вариант использования:

var customers = CustomerService.GetCustomersAndMostRecentOrder();
foreach (Customer c in customers) {
    Console.WriteLine(c.Lastname + ":" + 
                     c.Purchases.Count() == 0 ? "None" : c.Purchases[0].PurchaseOrder);
}

Спасибо за понимание.

1 Ответ

0 голосов
/ 22 июня 2011

Вам нужно будет выполнить часть запроса с linq-to-entity, а затем - с linq-to-objects следующим образом:

var query = (from c in Customers
             select new 
             { 
               Customer = c, 
               Purchase = c.Purchases.OrderByDescending(p => p.PurchaseDate).FirstOrDefault()
             })
            .AsEnumerable()
            .Select(c => new Customer()
                         {
                           CustomerID = c.CustomerID,
                           CustomerProperty2 = c.CustomerProperty2,
                           CustomerProperty3 = c.CustomerProperty3,
                           ...,
                           Purchases = new Purchase[] { c.Purchase }
                         } 
                    );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...