为什么linq试图检查第二个表达式呢?
.Where(t => String.IsNullOrEmpty(someNullString) || t.SomeProperty >= Convert.ToDecimal(someNullstring))
通常的解决方法是什么?
更新
当然,这是关于LINQ to SQL的。它无法转换为SQL。
答案 0 :(得分:11)
.Where
上是否使用了Table<>
?
如果是这样,那么在获取任何数据之前,它必须将LINQ转换为SQL,并且必须将string
转换为decimal
。它还没有尝试实际执行比较,它正在尝试构建检索数据所需的构造。
答案 1 :(得分:-1)
这有帮助吗?
.Where(t => String.IsNullOrEmpty(someNullString) || (t.SomeProperty >= Convert.ToDecimal(someNullstring)))
在第二个条件周围注意到()? 我认为它不起作用,但总的来说我更喜欢把()放在我的代码中的每个条件。这样,编译器在编译代码时知道哪些部分属于一起,为短路评估做好准备......
答案 2 :(得分:-1)
我无法通过短路评估重现任何问题......
我认为这会评估为:
[CompilerGenerated]
private static bool <MyMethod>b__f(MyObject t)
{
return (String.IsNullOrEmpty(someNullString)
|| t.SomeProperty >= Convert.ToDecimal(someNullstring));
}
短路在这里运作良好。
我怀疑您的Enumerable中的其他元素会将第一个条件(String.IsNullOrEmpty(someNullString)
)评估为false。你能证实一下吗?
提供更多代码,以便我们对此进行分析。
答案 3 :(得分:-1)
在可评估的任何范围内,您是否有变量 t ?
您是否尝试过这样的括号:
.Where(t => (String.IsNullOrEmpty(someNullString) ||
t.SomeProperty >= Convert.ToDecimal(someNullstring)))
答案 4 :(得分:-1)
The || (or) Operator in Linq with C#上有一个解决方法,根据您的具体情况,您可以采取以下措施:
.Where(t => t.SomeProperty >= Convert.ToDecimal(someNullstring ?? "0"))
当然,这可能不是您在特定情况下需要的解决方案,但至少它提供了如何绕过错误的想法。