Условные ярлыки в запросе LinqToSql - PullRequest
5 голосов
/ 06 декабря 2009

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

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

Ответы [ 2 ]

6 голосов
/ 06 декабря 2009

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

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

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

if (!string.isNullOrEmpty(state.statecode)
     q = q.where( s => s.code == state.statecode
3 голосов
/ 06 декабря 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...