2016-06-03 3 views
0

У меня есть 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 

Кто-нибудь знает, как этого добиться?

ответ

0

ОК, это работает. Для тех, кто хочет знать, я нашел ответ здесь. Calculating Intermediate Values

from p in PartRevisions 
let 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)) 

where (p.ImrInactive == 0) 
where (p.LastCost != p.AvgCost) || (p.LastCost != p.ImrStandardMaterialCost) 
where (last_avg > 10) || (last_avg == null) 
orderby last_avg descending 
select new { 
    PartID = p.ImrPartID, 
    Desc = p.ImrShortDescription, 
    AvgCost = p.AvgCost, 
    LastCost = p.LastCost, 
    Last_Avg = last_avg 
} 
0

Вы можете сделать это следующим образом:

(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)) 
}) 
.OrderByDescending(pr => pr.last_avg); 
+0

Я использую LINQPad5 для отладки в. Добавив, что оператор дает. не содержит определения для 'last_avg' и никакого метода расширения 'last_avg', принимающего первый аргумент типа ... error – labnet

+0

@labnet Вы скопировали его точно? Он отлично работает локально с LINQPad. Я бы предположил, что один из брекетов неуместен. – Rob

+0

Я дважды проверил, но все равно не пошел. Заметьте, что вы не включили предложение where, в котором я также нуждался. Спасибо за вклад так быстро, хотя. Я опубликовал ниже, что я думаю, ответ. – labnet