Linq to NHibernate: последовательность не содержит элементов - PullRequest
2 голосов
/ 13 ноября 2011

Я знаю, что я делаю что-то не так, я просто не знаю, что, поскольку я не очень уверен, в чем проблема.Вот код, который называется:

Звонок

System.Linq.Expressions.Expression<Func<AccountDataModel, bool>> deleg = 
                            (m => m.Email == model.Email);
                        AccountDataModel query = database.FindBy(deleg);

Куда ведет вызов

public T FindBy(Expression<Func<T, bool>> expression)
        {
            return FilterBy(expression).Single();
        }

public IQueryable<T> FilterBy(Expression<Func<T, bool>> expression)
        {
            return All().Where(expression).AsQueryable();
        }

public IQueryable<T> All()
        {
            return (from data in _session.Query<T>()
                   select data);
        }

Исключение

Sequence contains no elements

Ze details

По сути, сейчас я пытаюсь протестировать модуль регистрации на моем веб-сайте.который должен искать для электронной почты, которая была предоставлена, чтобы увидеть, существует ли она.У меня есть зашифрованный адрес электронной почты, скрытый в базе данных (и, да, адрес электронной почты в модели также был зашифрован), который должен совпадать с предоставленным регистрационным адресом электронной почты.Проблема в том, что результаты не возвращаются.

Что именно я здесь не так делаю?

1 Ответ

7 голосов
/ 13 ноября 2011

Ваш вызов .Single вызовет это исключение, когда последовательность пуста.Если возможно, что совпадений не будет найдено, вы должны использовать .SingleOrDefault, который вернет null, если совпадений не существует.

Очень важно понять различия между Single, SingleOrDefaultFirst и FirstOrDefault.

Вот полезная визуализация этих методов:

╔═════════════════╦═════════════╦═════════╦═════════════════════╗
║                 ║ [] (Empty)  ║ ["one"] ║ ["one", "two",...]  ║
╠═════════════════╬═════════════╬═════════╬═════════════════════╣
║ FirstOrDefault  ║ null        ║ "one"   ║ "one"               ║
║ First           ║ Exception   ║ "one"   ║ "one"               ║
║ SingleOrDefault ║ null        ║ "one"   ║ Exception           ║
║ Single          ║ Exception   ║ "one"   ║ Exception           ║
╚═════════════════╩═════════════╩═════════╩═════════════════════╝
╔═════════════════╦═════════════╦═════════╦═════════════════════╗
║ Error messages: ║ no elements ║         ║ multiple elements   ║
╚═════════════════╩═════════════╩═════════╩═════════════════════╝

Как видите, FirstOrDefault - единственный, который не будет генерировать исключение.

Итак, к чему это сводится, это :
ЕДИНСТВЕННАЯ причина использовать First, SingleOrDefault или Single, чтобы исключение было выдано, если ваши результаты не таковы.вы ожидаете!
Это улучшит отладку и улучшит семантический смысл вашего кода.

...