так, что если entryDate> = CUTOFF, то принять значение на CUTOFF, иначе принять значение на entryDate.Другими словами, я бы хотел добиться: SELECT Item. *, Value.value WHERE MAX (Item.entryDate, CUTOFF) == Value.date
Это противоречиво - if entryDate >= CUTOFF then take the value on CUTOFF
подразумеваетчто вы хотите MIN(Item.entryDate, CUTOFF)
, а не MAX
.
Сказав это, вы просто хотите выбрать значение. Значение, соответствующее каждому элементу вашего запроса.Каждый элемент должен искать соответствующее значение, соответствующее вашему выражению MAX (или, я полагаю, MIN).
query.Select(item =>
{
var matchingValue = Values.Single(v =>
v.date == Min(item.entryDate, CUTOFF));
return new { item, matchingValue.value };
});
Это вернет IQueryable анонимных { Item, double }
объектов.
Если вы хотите, чтобы это было выполнено как отдельный SQL-оператор, вам нужно провести некоторый рефакторинг.Хорошее начало - это поменять matchingValue
на один оператор.
query.Select(item => new { item, context.Values.Single(v =>
v.date == Min(item.entryDate, CUTOFF)).value });
Передо мной нет Visual Studio для подтверждения, но я не уверен, что функция Math.Min
отображается в LINQ-to-SQL.Давайте предположим, что это не так.
query.Select(item => new { item, context.Values.Single(v =>
v.date == (item.entryDate < CUTOFF ? item.entryDate : CUTOFF)).value });
Я полагаю, что это разрешит один запрос, если вы выполните его с .ToList()
, но не сможете подтвердить, пока передо мной не появятся какие-то инструменты.Проверьте это с помощью SQL Profiler, чтобы быть уверенным.