为什么lambda中的这个短路不起作用?

时间:2009-07-03 14:16:34

标签: c# linq linq-to-sql

为什么linq试图检查第二个表达式呢?

.Where(t =>  String.IsNullOrEmpty(someNullString) || t.SomeProperty >= Convert.ToDecimal(someNullstring))

通常的解决方法是什么?

更新
当然,这是关于LINQ to SQL的。它无法转换为SQL。

5 个答案:

答案 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"))

当然,这可能不是您在特定情况下需要的解决方案,但至少它提供了如何绕过错误的想法。