Условные ярлыки в запросе 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();
}
Угадайте, что - если вы передаете ноль State
возражая против этого метода, вы получите исключение нулевой ссылки! Похоже, что LinqToSql не использует ||
ярлык оператора как ярлык!
Ответ на вопрос идет к тому, кто предложит лучшее объяснение и обходной путь для этого.
2 ответа
Если это linq to sql, то помните, что Linq просто анализирует ваш запрос в SQL.
Поэтому он отправляет оба ваших предложения where в базу данных, отсюда и исключение. Я не нахожу это удивительным на самом деле, хотя это, возможно, неправильно.
Вам просто нужно сделать независимую проверку.
if (!string.isNullOrEmpty(state.statecode)
q = q.where( s => s.code == state.statecode
Это не относится к LINQ в целом. В этом случае поставщик LINQ-to-SQL пытается проанализировать ваше лямбда-выражение и сделать его запросом TSQL. Он не может делать слишком много предположений, основанных на вашем выражении, поскольку он пытается делегировать большую часть работы базе данных.
Короче говоря, поставщик просто не может перевести его на SQL.