为什么没有在这拉姆达短路工作?(Why isn't this short circuit i

2019-09-17 14:26发布

为什么LINQ试图反正检查第二体现在哪里?

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

什么是通常的解决办法?

更新:
它是关于LINQ to SQL的,当然。 它不能转换成SQL。

Answer 1:

.Where被在一个使用的Table<>

如果是这样,那么任何数据都可以抢下前,必须将LINQ转换为SQL要做到这一点,必须在转换string成一个decimal 。 它不是要实际执行比较的是,它试图建立必要的检索数据的结构。



Answer 2:

这是否帮助?

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

注意到()周围的第二个条件? 我不认为它的工作原理,但总的来说,我喜欢把()周围的每一个条件在我的代码。 这样,编译器知道哪些部分属于一起的时候它编译代码,短路评估做准备......



Answer 3:

我不能短路评价重现任何问题...

我觉得这个计算结果为类似:

[CompilerGenerated]
private static bool <MyMethod>b__f(MyObject t)
{
    return (String.IsNullOrEmpty(someNullString) 
                 || t.SomeProperty >= Convert.ToDecimal(someNullstring));
}

短路以及在这里工作。

我怀疑你可枚举其他元素评估第一条件( String.IsNullOrEmpty(someNullString)为false。 你能否证实?

提供更多的代码,以便我们可以分析一下这个。



Answer 4:

你有没有在任何范围内一个变量t可以评价?

你尝试用这样的括号:

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



Answer 5:

有一种变通方法上的|| Linq中(或)运算符与C#根据你会在你的情况是这样做的:

.Where(t =>  t.SomeProperty >= Convert.ToDecimal(someNullstring ?? "0"))

当然,这可能不是你在特定情况下需要的解决方案,但至少它给一个想法如何避开错误。



文章来源: Why isn't this short circuit in lambda working?