2009-06-23 3 views
3

Вот что у меня есть:Какова эквивалентность SQL WHERE в выражениях лямбда?

decimal sum = _myDB.Products.Sum(p => p.Price).GetValueOrDefault(); 

У меня также есть две даты: DateTime start, DateTime end
Я хочу, чтобы получить сумму всех цен продукции между началом и концом, но я не могу понять, как для включения переменных в лямбда-уравнение.

Как вы включаете переменные в уравнение лямбда, чтобы дать ему некоторые спецификации?

ответ

11

Использование Enumerable.Where

decimal sum = _myDB.Products 
        .Where(p => (p.Date >= start) && (p.Date <= end)) 
        .Sum(p => p.Price) 
        .GetValueOrDefault(); 
+6

Согласовано с точки зрения реализации, но запросы, как это много понятнее на несколько строк. Выровняйте точки :) –

+0

Хорошая точка в форматировании - я просто придерживался метода форматирования своего оригинального вопроса, для согласованности, но так я обычно пишу его в своем собственном коде. –

+0

@Jon: Готово. Не видел твой комментарий до этого момента. –

0
_myDB.Products 
.Where(p => p.start >= "somevalue") 
.Where(p => p.end <= "somevalue") 
.Sum(p => p.Price).GetValueOrDefault(); 
+0

Нет необходимости иметь два предложения с отдельными предикатами. –

+0

Я предпочитаю этот стиль, так как он улучшает читаемость – Rony

1
decimal sum = _myDB.Products 
.Where(p => p.Start >= mystartDate && p.End <= myenddate) 
.Sum(p => p.Price) 

Pardon мой синтаксис. Но, надеюсь, у вас есть идея.

EDIT: Исправлено после предложения Рида.
Старый код (некорректная)

decimal sum = _myDB.Products 
.Sum(p => p.Price) 
.Where(p => p.Start >= mystartDate && p.End <= myenddate) 
+0

Предложение Where должно идти до Sum. Сумма возвращает десятичное число, и вы не можете сделать «.Where» в десятичном значении. –

+0

Ребята, будет ли это работать по-другому (в отличие от WHERE, а затем SUM)? – shahkalpesh

+1

Это не будет компилироваться вообще. Вы не можете запустить. Где по одному значению, которое возвращает сумма(). –