Linq到NHibernate:序列不包含元素

Hol*_*tte 2 c# nhibernate linq-to-nhibernate asp.net-mvc-3

我知道我在这里做错了,我只是不知道是什么,因为我不太确定问题是什么.这是被称为的代码:

电话

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

电话通向哪里

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);
        }
Run Code Online (Sandbox Code Playgroud)

抛出异常

Sequence contains no elements
Run Code Online (Sandbox Code Playgroud)

泽细节

基本上,我现在正在尝试测试的是我网站上的注册模块,该模块应该搜索已经提供的电子邮件以查看它是否存在.我在数据库中隐藏了一个加密的电子邮件地址(是的,模型中的电子邮件也已加密),这应该与提供的注册电子邮件相匹配.问题是没有返回任何结果.

我到底错在了什么?

Sco*_*pey 7

.Single当序列为空时,您的调用将抛出此异常.如果可能没有找到匹配项,您应该使用.SingleOrDefault,null如果不存在匹配项,将返回该匹配项.

就明白之间的差别是非常重要的Single,SingleOrDefault,First,和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是,如果您的结果不符合您的预期,将会抛出异常!
这将为您提供更好的调试体验,并为您的代码提供更好的语义含义.