2013-11-26 3 views
1

Я новичок в LINQ, я только начинаю понимать его синтаксис, но все же решил использовать приложение Linqer для преобразования моих операторов SQL в операторы LINQ. Однако запросы LINQ не дают одинакового результата.Linqer SQL to LINQ conversion - Различные результаты

Вот мой SQL-запрос:

SELECT ISNULL(SUM(linehaul + accessorial), 0) FROM costs 
WHERE 
ordnumber = 19374911 

Он преобразует в этот LINQ:

From Costs In 
(From Costs In db.Costs 
Where 
    CLng(Costs.ordnumber) = 19374911 
Select 
    Column1 = CType((Costs.linehaul + Costs.accessorial),Decimal?), 
    ordnumber = Costs.ordnumber, 
    linehaul = Costs.linehaul, 
    accessorial = Costs.accessorial, 
    Dummy = "x" 
) 
Group Costs By Costs.Dummy Into g = Group 
Select New With { 
    .Column1 = If(CType(g.Sum(Function(p) p.linehaul + p.accessorial),Decimal?) Is Nothing,0,g.Sum(Function(p) p.linehaul + p.accessorial)) 
} 

Я не могу сказать, что я понимаю, это преобразование 100%, но это не главное. Если у меня есть затраты на данный порядковый номер, то результаты будут согласованы, но если затраты не будут найдены для заданного ordnumber, LINQ возвращает пустой набор результатов вместо того, чтобы возвращать значение по умолчанию «0», как это делает мой SQL.

Что мне нужно добавить в LINQ, чтобы он возвращал ноль вместо пустого результата?

+2

Это запрос выглядит более сложным, чем нужно. – Mansfield

+0

@Mansfield - я абсолютно согласен, он фактически выбрал все остальные поля из этой таблицы, которые я вручную удалил. Не уверен, что я понимаю, зачем нам это фиктивное поле и группировка. Как только я научусь писать LINQ вручную, я уверен, что смогу выполнить это в более простом запросе. В этот момент я бы хотел получить 0, если записи о расходах не найдены для данного заказа. –

+0

Вы используете linq для sql? Или структура сущности? – Mansfield

ответ

1

Вы должны быть в состоянии сделать что-то вроде этого (должен работать как для EF и L2SQL):

int cost = Context.Costs.Where(x => x.ordnumber == 19374911) 
    .Sum(y => y.linehaul + y.accessorial)) ?? 0; 

VB.net должно быть что-то вроде этого: (не тестировалось)

Dim cost As Integer = If(Context.Costs.Where(Function(cost) cost.ordnumber = 19374911).Sum(Function(x) x.linehaul + y.accessorial)), 0) 
+1

Его вопросы используют VB.NET. Может быть, вы должны сделать то же самое? – MarcinJuraszek

+1

@MarcinJuraszek Не видел тег ... Я его преобразую. – Mansfield

+0

Легче, чем я ожидал. –