Запрос Linq to SQL не возвращает ожидаемых результатов - PullRequest
1 голос
/ 19 января 2011

Может кто-нибудь объяснить мне, почему эти два функционально различаются?

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

Код всегда возвращает ноль в моих образцах данных:

to_follows_contact = db.CONTACTs.Where(n =>
    n.ACCOUNTID == account.ACCOUNTID
    && (
        (n.FIRSTNAME + n.MIDDLENAME + n.LASTNAME + @"").Replace(@" ", @"") 
                                                            == @"TOFOLLOW"
        ||
        (n.FIRSTNAME + n.MIDDLENAME + n.LASTNAME + @"").Replace(@" ", @"") 
                                                            == @"FOLLOWTO"
    )
).FirstOrDefault();

Код возвращает правильный контакт в моих данных образца:

foreach (CONTACT n in db.CONTACTs.Where(n => n.ACCOUNTID == account.ACCOUNTID))
{
    string ContactName = (n.FIRSTNAME + n.MIDDLENAME + n.LASTNAME + @"")
                         .Replace(@" ", @"");
    if (ContactName == @"TOFOLLOW" || ContactName == @"FOLLOWTO")
        to_follows_contact = n;
}

Ответы [ 2 ]

5 голосов
/ 19 января 2011

Что происходит, так это то, что первый пример кода полностью решает проблему в T-SQL. К сожалению, перевод с C # на SQL не совсем прозрачен.

SQL обрабатывает нулевые значения иначе, чем .NET. SELECT 'Foo' + NULL + 'Bar' вернет NULL. Вам нужно будет использовать COALESCE или что-то подобное. В LINQ to SQL это означает:

(n.FIRSTNAME ?? "" + n.MIDDLENAME ?? "" + n.LASTNAME ?? "").Replace(" ", "")

Если вы используете это, оно должно работать нормально.

Если вам интересно, вы можете использовать db.GetCommand(IQueryable<T>), чтобы получить сгенерированный оператор SQL. Он также доступен, когда вы наведите курсор на переменную IQueryable в фрагменте исходного кода во время отладки.

*: это обычно зависит от некоторых параметров базы данных, которые вы можете установить, но это поведение по умолчанию.

1 голос
/ 19 января 2011

Скорее всего, сгенерированный SQL объединит различные строки, однако, если одна из них имеет значение null, вы всегда получите NULL, возвращенный из конкатенации, что не пройдет тест на равенство.

В коде строки всегда будут пустыми, что затем сработает.

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