mfc
mfc

Reputation: 3026

LINQ; how to get record with max date with join?

How can I do this in 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 )

not worried about dups as there will always only be one order per day.

I got as far as the left join in LINQ, but not sure how or where to put the subquery in.

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
            };

FINAL SOLUTION:

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
            };

Another solution without any 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
            };

Upvotes: 15

Views: 16520

Answers (2)

Enigmativity
Enigmativity

Reputation: 117057

How does this work for you?

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
    };

Upvotes: 2

Albin Sunnanbo
Albin Sunnanbo

Reputation: 47038

This is more or less a literal translation

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
            };

but I would rewrite to

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
            };

Upvotes: 22

Related Questions