setlio
setlio

Reputation: 726

How to write Linq expression using external objects

I am trying to convert a loop in to a linq expression. But it seams not to work the way i am doing it:

var customer = GetCustomerFromDatabase(id);
ICollection<Order> customerOrders = null;
if (customer == null)
{
    LogAndThrowCustomerNotFound(id);
}
else
{
    customerOrders = customer.Orders;
}

customer.YearToDateSales = 0.0;
customer.CurrentSales = 0.0;
DateTime today = DateTime.Now;

if (customerOrders != null)
    foreach (var order in customerOrders)
    {
        if (order.SubmittedDate != null 
            && order.SubmittedDate.Value.Year.CompareTo(today.Year) == 0)
        {
            customer.YearToDateSales += (double)order.OrderTotal;
        }

        if (order.SubmittedDate != null 
            && (order.SubmittedDate.Value.Month.CompareTo(today.Month) == 0 
            && order.SubmittedDate.Value.Year.CompareTo(today.Year) == 0))
        {
            customer.CurrentSales += (double)order.OrderTotal;
        }
    }

So I came up with that expression to get the customer orders that match the current year... bot it does not work. in he expression order is empty and today is conflicting. I i create DateTime today = DateTime.Now; in the parm of the expression i get different errors...

IEnumerable<Order> cOrders = customerOrders
   .Where((ICollection<Order> order , today) =>
           order.SubmittedDate.Value.Month == today.Month);

Upvotes: 0

Views: 205

Answers (2)

Joachim Isaksson
Joachim Isaksson

Reputation: 180987

It's simpler if you just don't attempt pass today into the lambda, it'll be closed into the expression anyway;

customer.YearToDateSales = customerOrders
    .Where(x => x.SubmittedDate != null && 
                x.SubmittedDate.Value.Year == today.Year)
    .Sum(x => x.OrderTotal);

customer.CurrentSales = customerOrders
    .Where(x => x.SubmittedDate != null && 
                x.SubmittedDate.Value.Month == today.Month &&
                x.SubmittedDate.Value.Year  == today.Year)
    .Sum(x => x.OrderTotal);

Upvotes: 2

Steve Danner
Steve Danner

Reputation: 22158

Hard to tell exactly what's wrong without the error, but you probably need to check for null on the SubmittedDate like in the original version:

IEnumerable<Order> cOrders = customerOrders
      .Where((ICollection<Order> order , today) => 
         order.SubmittedDate.HasValue && 
         order.SubmittedDate.Value.Month == today.Month);

Upvotes: 0

Related Questions