Условные ярлыки в запросе 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.