2015-10-15 63 views
1

我正在維護一個項目,並遇到一些我無法理解的代碼。 LINQ查詢:不理解LINQ查詢

var toDraw = from tile in testArr.AsEnumerable() 
      where tile.Item_Business_Unit != null ? 
      ((tile.Ending_Date >= DateTime.Now || tile.Ending_Date == DateTime.MinValue) && 
      ((tile.Sales_Code == null) || (tile.Sales_Code.ToString() == customerNumber) || 
      (tile.Sales_Code.ToString() == cpg)) && (tile.Unit_Price != 0)) : 
      ((tile.Ending_Date >= DateTime.Now || tile.Ending_Date == DateTime.MinValue) && 
      ((tile.Sales_Code == null) || (tile.Sales_Code.ToString() == customerNumber) || 
      (tile.Sales_Code.ToString() == cpg)) && (tile.Unit_Price != 0)) 
          select tile; 

從我明白,從數組中被選擇的瓦片,其具有以下條件:

  • 結束日期可以是datetime.nowdatetime.minvalue
  • 銷售代碼可以爲空或者可以等於客戶沒有或CPG
  • 單價應大於0

但我不明白爲什麼在tile.Item_Business_Unit之後有條件表達式,因爲這兩個條件執行相同的操作。那麼即使它的業務單位爲空,該項目也會被選中嗎?這個工作與普通的if/else操作不同嗎?

任何建議將不勝感激。

+0

看起來像一個遺蹟。在某個時候,在查詢中使用了'tile.Item_Business_Unit',但現在已經不存在了 - 這個三元組保留了下來,因爲做這個變更的那個人並沒有打擾它。 – Luaan

+0

@Luaan謝謝。所以這意味着兩者執行相同的事情。只是想要確認,因爲這是一個對企業至關重要的項目,我不能惹惱它。謝謝。 – Akhoy

+0

好吧,如果你想絕對肯定的話,看一看'Item_Business_Unit'的代碼 - 它可能有一個副作用,你可能會刪除。這將是相當鬼鬼祟祟的(而且是你爲另一個人殺P的罪行),但這是可能的。如果它沒有副作用,可以安全地將其移除。 – Luaan

回答

3

您是否被快捷方式符號拋出?

x = (test_case) ? (true_part) : (false_part); 

如果test_case評估爲真正,你就必須

true_part

而如果test_case計算結果爲,這個表達式將被評估

false_part

UPDATE:

作爲一個供參考:將所得的上述條件表達式的兩側的測試是相等的,使得隱蔽代碼甚至沒有必要。

您可以用此取代:

var toDraw = from tile in testArr.AsEnumerable() 
    where 
    ((tile.Ending_Date >= DateTime.Now || tile.Ending_Date == DateTime.MinValue) && 
    ((tile.Sales_Code == null) || (tile.Sales_Code.ToString() == customerNumber) || (tile.Sales_Code.ToString() == cpg)) && 
    (tile.Unit_Price != 0)) 
    select tile; 
+0

對,所以它是一樣的東西。抱歉用一個愚蠢的問題來困擾社區。只是確認。 – Akhoy

+0

我在這裏問了很多愚蠢的問題。有時候,你只是不知道。 – jp2code

+0

我一直在屏幕截圖中查看雙方的條件表達式。他們看起來一樣。你有沒有給原文添加一個錯字?如果不是的話,你可能會刪除那個神祕的測試。這將使查詢對所有其他軟件開發人員更易讀。 – jp2code