Подтвердить что ты не робот

Почему это короткое замыкание в лямбда не работает?

Почему linq пытается проверить второе выражение?

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

Что такое обычное обходное решение?

Update:
Конечно, речь идет о LINQ to SQL. Он не может перевести на SQL.

4b9b3361

Ответ 1

Используется ли .Where на Table<>?

Если это так, то до того, как все данные могут быть захвачены, он должен преобразовать LINQ в SQL и сделать это, чтобы он преобразовал string в decimal. Он еще не пытается выполнить сравнения, он пытается построить конструкции, необходимые для извлечения данных.

Ответ 2

Помогает ли это?

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

Заметили() вокруг второго условия? Я не думаю, что это работает, но в целом я предпочитаю использовать() вокруг каждого условия в моем коде. Таким образом, компилятор знает, какие части принадлежат вместе при компиляции кода, чтобы подготовить его для оценки короткого замыкания...

Ответ 3

Я не могу воспроизвести какие-либо проблемы с оценкой короткого замыкания...

Я думаю, что это оценивается примерно так:

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

короткое замыкание хорошо работает здесь.

Я подозреваю, что другие элементы в вашем Enumerable оценивают первое условие (String.IsNullOrEmpty(someNullString)) на false. Можете ли вы это подтвердить?

Предоставьте немного больше кода, чтобы мы могли проанализировать это.

Ответ 4

У вас есть переменная t в любой области, которая может быть оценена?

Пробовал ли вы с помощью круглых скобок:

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

?

Ответ 5

Существует обходное решение The || (или) Оператор в Linq с С#, согласно которому вы делаете в своем случае что-то вроде:

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

Конечно, это может быть не решение, которое вам нужно в вашем конкретном случае, но, по крайней мере, оно дает представление о том, как обходить ошибку.