2011-11-12 158 views
3
From r In ReceiptLines 
Where 
r.RECEIPT.RECEIPTDATE >= _reportStartDate 
And r.RECEIPT.RECEIPTDATE <= _reportEndDate 
Let amount = r.QUANTITY * r.PRICE 
Let discount = r.RECEIPTDISCOUNTs.Sum(Function(d) d.DISCOUNT) 
where discount > 0 
Group By Department = r.ITEMSTYLE.ITEM.CATEGORY.DEPARTMENT.DEPARTMENTNAME 
Into Sales = Sum(amount - discount), 
Average = Average(amount - discount), 
Count = Count() 

我從ReceiptLine,Receipt,ReceiptDiscount表中提取所有部門及其銷售額,平均值,計數。我面臨的問題是,如果我刪除折扣> 0,我得到空例外。但是,如果我包括這一點,那麼我只會得到有折扣的銷售。 我會如何編寫查詢,使所有銷售減少折扣(如果有的話)。任何幫助,高度讚賞。Linq查詢處理空值

+0

它看起來像你的代碼是VB.NET。我添加了該標籤,如果這是錯誤的,您可以更正該標籤。 –

回答

8

這是LINQ2SQL的一個常見問題。

如果集合中沒有項目,但Enumerable.Sum()的簽名返回int,SQL中的函數SUM將返回null。當SQL查詢在LINQ2SQL提供程序需要一個整數時返回null時,會產生運行時異常。

解決的辦法是把結果總和到一個可爲空整數並使用GetValueOrDefault到空的情況下轉換爲0

替換

Let discount = r.RECEIPTDISCOUNTs.Sum(Function(d) d.DISCOUNT) 

Let discount = CType(r.RECEIPTDISCOUNTs.Sum(Function(d) d.DISCOUNT), Integer?).GetValueOrDefault(0) 
1

你試過:

... 
Let amount = r.QUANTITY * r.PRICE 
Let nDiscount = r.RECEIPTDISCOUNTs.Sum(Function(d) d.DISCOUNT) 
Let discount = IIf(nDiscount == Nothing, 0, nDiscount) 
Group By Department = r.ITEMSTYLE.ITEM.CATEGORY.DEPARTMENT.DEPARTMENTNAME 
... 
+2

我認爲Muthu的代碼看起來像VB.NET,而三元運算符在VB.NET中的發音爲「IF(Condition,TrueValue,FalseValue)」。 –

+0

是的!習慣了很長一段時間在C#中的代碼。沒有注意到這一點。謝謝。 – Kamyar

+2

和......'null'在VB.NET中拼寫爲'Nothing'。當你習慣了C#時,寫VB.NET感覺就像你在鍵盤上倒了兩杯咖啡。你只需像往常一樣打字,但到處都會出現紅色的小點。 –