2017-03-31 38 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你正在使用哪个数据连接器。 –