LINQ; как получить запись с максимальной датой со входом?
Как это сделать в LINQ?
select
*
from customer c
left join order o on o.CustomerID = c.CustomerID
where o.OrderDate = (select MAX(OrderDate) from order where CustomerID = o.CustomerID )
не беспокоится о дублирующих устройствах, так как всегда будет только один заказ в день.
Я добрался до левого соединения в LINQ, но не уверен, как и где поставить подзапрос.
var query = from customer in clist
from order in olist
.Where(o => o.CustomerID == customer.CustomerID)
select new {
customer.CustomerID,
customer.Name,
customer.Address,
Product = order != null ? order.Product : string.Empty
};
ЗАКЛЮЧИТЕЛЬНОЕ РЕШЕНИЕ:
var query = from customer in clist
from order in olist
.Where(o => o.CustomerID == customer.CustomerID && o.OrderDate ==
olist.Where(o1 => o1.CustomerID == customer.CustomerID).Max(o1 => o1.OrderDate)
)
select new {
customer.CustomerID,
customer.Name,
customer.Address,
order.Product,
order.OrderDate
};
Другое решение без lambdas
var query = from customer in clist
from order in olist
where order.CustomerID == customer.CustomerID && order.OrderDate ==
(from o in olist
where o.CustomerID == customer.CustomerID
select o.OrderDate).Max()
select new {
customer.CustomerID,
customer.Name,
customer.Address,
order.Product,
order.OrderDate
};
Ответы
Ответ 1
Это более или менее буквальный перевод
var query = from customer in clist
from order in olist
.Where(o => o.CustomerID == customer.CustomerID &&
o.OrderDate == olist
.Where(o => o.CustomerID == customer.CustomerID)
.Select(o => o.OrderDate).Max())
select new {
customer.CustomerID,
customer.Name,
customer.Address,
Product = order != null ? order.Product : string.Empty
};
но я переписал бы
var query = from customer in clist
from order in olist
.Where(o => o.CustomerID == customer.CustomerID)
.OrderByDescending(o => o.OrderDate).Take(1)
select new {
customer.CustomerID,
customer.Name,
customer.Address,
Product = order != null ? order.Product : string.Empty
};
Ответ 2
Как это работает для вас?
var query =
from customer in clist
join order in olist
on customer.CustomerID equals order.CustomerID
into orders
select new
{
customer.CustomerID,
customer.Name,
customer.Address,
Product = orders
.OrderByDescending(x => x.OrderDate)
.Select(x => x.Product)
.FirstOrDefault() ?? String.Empty
};