У меня есть SQL-запрос, который я пытаюсь преобразовать в LINQ для C#, но я не могу разобраться, как сортировать и фильтровать вычисляемое поле.Фильтрация и сортировка по вычисленному полю
from p in PartRevisions
where (p.Inactive == 0)
where (p.LastCost != p.AvgCost) || (p.LastCost != p. StandardCost)
select new {
PartID = p.PartID,
Desc = p.ShortDescription,
AvgCost = p.AvgCost,
LastCost = p.LastCost,
last_avg = 100* ((p.AvgCost > p.LastCost) ?
((p.LastCost > 0) ? (p.AvgCost - p.LastCost)/p.LastCost : (decimal?)null):
((p.AvgCost> 0) ? (p.LastCost - p.AvgCost)/p.AvgCost : (decimal?)null))
}
запрос выполняется нормально, но мне нужно добавить, где положение и положение своего рода расчетного поля last_avg т.е. где last_avg> 10 OrderBy last_avg по убыванию.
Это тот же самый запрос в SQL
SELECT PartID, PartRevisionID, LastCost, AverageCost,
CASE WHEN LastCost < AvgCost THEN (AvgCost - LastCost)/NULLIF (LastCost, 0) ELSE (LastCost - AvgCost)/NULLIF (AvgCost, 0) END AS Last_Avg,
FROM PartRevisions
WHERE (LastCost <> AvgCost OR LastCost <> StandardCost) AND (Inactive == 0)
ORDER BY Last_Avg DESC
Кто-нибудь знает, как этого добиться?
Я использую LINQPad5 для отладки в. Добавив, что оператор дает. не содержит определения для 'last_avg' и никакого метода расширения 'last_avg', принимающего первый аргумент типа ... error – labnet
@labnet Вы скопировали его точно? Он отлично работает локально с LINQPad. Я бы предположил, что один из брекетов неуместен. – Rob
Я дважды проверил, но все равно не пошел. Заметьте, что вы не включили предложение where, в котором я также нуждался. Спасибо за вклад так быстро, хотя. Я опубликовал ниже, что я думаю, ответ. – labnet