2009-12-06 4 views
5

Вот немного LinqToSql GOTCHA:Условные ярлыки в LinqToSql запросе

// 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 не использует оператор быстрого доступа || в качестве ярлыка!

Ответьте на вопрос, кто предлагает лучшее объяснение. & Обходной путь для этого.

+0

Это LinqToSql? –

+0

В «нормальном» Linq аналогичный запрос работает отлично для меня. –

+0

Да, это LinqToSql - извините, отредактируйте вопрос –

ответ

6

Если это linq для sql, то помните, что Linq просто анализирует ваш запрос в SQL.

Поэтому отправка обоих ваших предложений where в базу данных, следовательно, исключение. На самом деле я не нахожу этого удивительным, хотя это, возможно, неправильно.

Вам просто нужно сделать независимую проверку.

if (!string.isNullOrEmpty(state.statecode) 
    q = q.where(s => s.code == state.statecode 
+0

+1 Мне нравится идея добавления запроса с помощью лямбда. –

3

Это не связано с LINQ в целом. В этом случае поставщик LINQ-to-SQL пытается проанализировать ваше выражение лямбда и сделать его TSQL-запросом. Он не может сделать слишком много предположений, основанных на вашем выражении, поскольку он пытается делегировать большую часть работы в базу данных.

Короче говоря, поставщик просто не может перевести его на SQL.

Смежные вопросы