2015-10-23 2 views
1

У меня есть следующиеИспользование Linq, чтобы получить дату последнего заказа для всех клиентов

public class Customers 
{ 
    public Guid Id { get; set; } 
    public string FirstName{ get; set; } 
    public string LastName{ get; set; } 
} 

и

public class Orders 
{ 
    public Guid Id { get; set; } 
    public Guid CustomerId { get; set; } 
    public string Product { get; set; } 
    public DateTime Date { get; set; } 
} 

Предполагая, что моя служба данных двух Poco возвращает список < Клиенты > и Список < Заказы > , как я могу использовать Linq для получения даты последнего заказа для каждого клиента?

Я хочу вернуть Customer.Id, Customer.FirstName, Customer.LastName, Order.Id, Order.Date и Order.Product (как Json из действия контроллера), так что мне также нужно будет создать новый POCO проводить результаты? что-то вроде следующего:

public class CustomerOrders 
{ 
    public Guid CustomerId { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public Guid OrderId { get; set; } 
    public DateTime Date { get; set; } 
    public string Product { get; set; } 
} 

ответ

0

Вы можете использовать GROUP BY и JOIN вроде этого:

var customerOrders = 
    (from c in customers 
    join o in (from o1 in orders 
       group o1 by o1.CustomerId into og 
       select new { CustomerId = og.Key, Latest = og.Max(d => d.Date) }) 
    on c.Id equals o.CustomerId 
    join o2 in orders 
    on new {CustmerId = o.CustomerId, Date = o.Latest } 
    equals new { CustmerId = o2.CustomerId, Date = o2.Date } 

    select new CustomerOrders 
    { 
     CustomerId = c.Id, 
     FirstName = c.FirstName, 
     LastName = c.LastName, 
     OrderId = o2.Id, 
     Date = o.Latest, 
     Product = o2.Product 
    }); 

Если вы хотите, чтобы результаты клиентов без каких-либо порядка, condier использованием LEFT OUTER JOIN с помощью DefaultIfEmpty вроде этого:

var customerOrders = 
    (from c in customers 
    join o in (from o1 in orders 
       group o1 by o1.CustomerId into og 
       select new { CustomerId = og.Key, Latest = og.Max(d => d.Date) }) 
    on c.Id equals o.CustomerId into co 
    from o in co.DefaultIfEmpty() // LEFT OUTER JOIN 1 
    join o2 in orders 
    on new { CustmerId = (o == null)? Guid.Empty : o.CustomerId, Date = (o == null)? DateTime.MinValue : o.Latest } 
    equals new { CustmerId = o2.CustomerId, Date = o2.Date } into oo 
    from o2 in oo.DefaultIfEmpty() // LEFT OUTER JOIN 2 

    select new CustomerOrders 
    { 
     CustomerId = c.Id, 
     FirstName = c.FirstName, 
     LastName = c.LastName, 
     OrderId = (o2 == null)? Guid.Empty : o2.Id, 
     Date = (o == null)? DateTime.MinValue : o.Latest, 
     Product = (o == null)? null : o2.Product 
    }); 

Пожалуйста, обратите внимание, LEFT OUTER JOIN может присоединяться со значением нуля, так что вы имеете для добавления нулевых проверок в запросе linq.

+0

Вы упомянули LEFT OUTER JOIN и использовали DefaultIfEmpty. Не могли бы вы указать, какое соединение в частности и где я буду использовать DefaultIfEmpty? Спасибо – random

+0

Привет @ user3583 Я обновил свой ответ для случая LEFT OUTER JOIN. – jhmt

Смежные вопросы