Условные ярлыки в запросе LinqToSql
Здесь немного LinqToSql GOTCHA:
// Returns the number of counties in a state,
// or all counties in the USA if the state is null
public static int CountCounties(State s) {
var q =
from cy in County.GetTable() // my method to get the ITable
where (s == null || s.Code == cy.StateCode) // shortcut OR operator, right...?
select cy;
return q.Count();
}
Угадайте, что - если вы передаете объект null State
этому методу, вы получите исключение с нулевой ссылкой! Похоже, что LinqToSql не использует оператор ярлыка ||
в качестве ярлыка!
Ответьте на вопрос, кто предложит лучшее объяснение и обходное решение для этого.
Ответы
Ответ 1
Если это linq для sql, то помните, что Linq просто анализирует ваш запрос в SQL.
Поэтому он отправляет оба ваших предложения where в базу данных, и, следовательно, исключение. На самом деле я не нахожу этого удивительным, хотя это, возможно, неправильно.
Вам просто нужно выполнить независимую проверку.
if (!string.isNullOrEmpty(state.statecode)
q = q.where( s => s.code == state.statecode
Ответ 2
Это не относится к LINQ вообще. В этом случае поставщик LINQ-to-SQL пытается проанализировать ваше выражение лямбда и сделать его TSQL-запросом. Он не может сделать слишком много предположений, основанных на вашем выражении, поскольку он пытается делегировать большую часть работы в базу данных.
Короче говоря, поставщик просто не может перевести его на SQL.