2011-03-07 22 views
5

我有LINQ查詢以下塊來計算的報告中的值。爲什麼我的linq查詢中的值不會立即顯示?

var items = (from trans in calclabordb.Sales_Transactions     
      select trans).SelectMany(st => st.Sales_TransactionLineItems).Where(stli => stli.TypeID == typeID); 

decimal test = items.Where(stli => stli.Inventory_Item is Base).Sum(stli => (decimal?)stli.Inventory_Item.IntExtraServiceAmount) ?? 0; 
decimal test2 = items.Where(stli => stli.Inventory_Item is Extra).Sum(stli => (decimal?)stli.ItemPrice) ?? 0; 
decimal test3 = test + test2; 
current.ExtraSales = items.Where(stli => stli.Inventory_Item is Base).Sum(stli => (decimal?)stli.Inventory_Item.IntExtraServiceAmount) ?? 0 + 
    items.Where(stli => stli.Inventory_Item is Extra).Sum(stli => (decimal?)stli.ItemPrice) ?? 0; 

我已經在調試器中加入了代碼,我注意到了一些奇怪的地方。分配到test後其值爲0到分配ExtraSalesExtraSales == 11.31後分配到TEST3 test == 11.31test2 == 11.28test3 == 22.59後分配到test2test2 == 0test == 11.31之後。當這一切都完成時,ExtraSales中的值應該是22.59。這裏發生了什麼?

編輯:我已經添加了分配後附加線到ExtraSales,但價值不會改變。

回答

22

是說,這是一個延遲執行的問題是錯誤的答案。這是一個運算符優先級問題。

擺脫一切完全不相關,並在那裏無法閱讀的代碼。全是紅鯡魚。相關的攝製是:

decimal? d1 = 11.31m; 
decimal? d2 = 11.28m; 
decimal test1 = d1 ?? 0m; 
decimal test2 = d2 ?? 0m; 
decimal test3 = test1 + test2; 
decimal test4 = d1 ?? 0m + d2 ?? 0m; 

什麼是最後一行的含義是什麼?它是否與之前的產品線一樣?

不,不。加法運算符更高的優先級比空合併運算符,所以這是

decimal test4 = d1 ?? (0m + d2) ?? 0m; 

你寫的意思是「代碼產生d1的值,如果D1不爲null。如果d1是零和0米+ D2是不爲null,則產生0m + d2的值,如果0m + d2爲null,則產生值0m。 (你可能不知道??運算符有這個令人愉快的鏈接屬性,一般而言,a ?? b ?? c ?? d ?? e給出了a,b,c或d的第一個非空值,如果它們全都爲空,則e你可以讓鏈條,只要你喜歡。這是一個相當優雅的小運營商。)

由於D1不爲空,我們生產的價值和TEST4被分配D1的值。

你大概的意思是說:

decimal test4 = (d1 ?? 0m) + (d2 ?? 0m); 

如果你的意思是「D1或D2可以爲空,如果任是,則處理零一個零」。所以,12 + 2是14,12 + null是12,空+空爲0

如果你的意思是 「無論是D1和D2可能是空的,如果要麼爲null,則我想零」,這是

decimal test4 = (d1 + d2) ?? 0m; 

所以,12 + 2是14,12 +空爲0,空+空爲0

我注意,如果您已格式化您的代碼,使相應的文本是在屏幕上,你可能止跌」我已經得到了五個左右的錯誤答案。嘗試對代碼進行格式化,以使其全部都在屏幕上;如果你這樣做,你會得到更好的答案。

+0

像專家一樣回答。 – 2011-03-07 21:27:04

+0

你知道我應該知道更好。在過去的情況下,我遇到了這個優先問題?比其他運營商具有更高的優先級。調試器似乎給了我誤導性的信息。 – Mykroft 2011-03-09 14:27:20

-1

是的,這就是所謂的延遲執行和它的東西可真厲害一個,而且你絆倒,如果你不希望它...

相關問題