2017-03-31 25 views
0

不知道爲什麼這個查詢返回任何結果(注意:CUSTOMERs是從Oracle數據庫):LINQ .equals()和字符串變量

string zip = "12345" 
string state = "MA" 

var result = from x in CUSTOMERs 
      where x.STATE.Equals(state) || x.ZIP.Equals(zip) 
      select x; 

但是這一次呢?

var result = from x in CUSTOMERs 
      where x.STATE.Equals("MA") || x.ZIP.Equals("12345") 
      select x; 
+1

無法複製描述的行爲需要表達式樹,而不是Func<T,bool>。你做了哪些具體的調試來確認這一點? 「CUSTOMERs」具體是什麼? – David

+0

我在LinqPad做這個,不知道如何在那裏調試? CUSTOMERs是一個Oracle數據庫。 – PixelPaul

+0

如果您在實際應用中嘗試,會發生什麼情況? (只是爲了縮小與LinqPad有關的問題的可能性。)*特別是* CUSTOMERs'。這個變量的類型是什麼,它包含什麼等等。 – David

回答

1

以下是我的理解,你是在LinqPad使用Oracle data connector,它允許你來查詢客戶表,現在因爲你運行的是IQueryable<T> Linq Query,它不像Linq to Objects,執行在遠程數據源,並採取表達式樹形式爲Expression<Func<T,bool>。當提供變量而不是實際硬編碼值時,它無法綁定這些值。帶綁定值的問題純粹是由於它期望的方式以及內部解析Expression樹。

爲了驗證我的觀點,在流利的語法檢查CUSTOMERs.Where簽名,這將是採取由Linq2Objects

+0

感謝您的回覆,但我是不確定我完全理解這一點。有沒有一種解決方法來讓它在LinqPad中工作? – PixelPaul

+0

如果它可以嘗試以下操作: 'const string zip =「12345」' 'const string state =「MA」' –

+0

我的建議是,因爲查詢由數據庫的數據連接器轉換服務器進行處理,有可能無法翻譯變量,當生成查詢時,您可能需要檢查其文檔以查看,因爲它們可能有不同的機制來像佔位符那樣進行綁定。 Btw你正在使用哪個數據連接器。 –