Почему это короткое замыкание в лямбда не работает?
Почему linq пытается проверить второе выражение?
.Where(t => String.IsNullOrEmpty(someNullString) || t.SomeProperty >= Convert.ToDecimal(someNullstring))
Что такое обычное обходное решение?
Update:
Конечно, речь идет о LINQ to SQL. Он не может перевести на SQL.
Ответы
Ответ 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"))
Конечно, это может быть не решение, которое вам нужно в вашем конкретном случае, но, по крайней мере, оно дает представление о том, как обходить ошибку.