在NHibernate LINQ中处理空值

本文关键字:处理 空值 LINQ NHibernate | 更新日期: 2023-09-27 18:21:27

我有一个NHibernate查询,如下所示:

var users = from u in _session.Query<User>();
            select new
                   {
                       u.FirstName
                       u.LastName,
                       u.UserGroups.FirstOrDefault(x => x.Group.GroupId == id).EmailAddress
                   }

但是,如果用户没有具有指定ID的组,则NHibernate不会将EmailAddress属性默认为null,而是抛出以下错误:

Exception of type 'Antlr.Runtime.NoViableAltException' was thrown [.Select[MyProject.Data.Entities.User,<>f__AnonymousType0`3[ ...[Snipped]

它似乎被丢失的UserGroup实体卡住了。

如果我修改这个查询,以便在找不到新UserGroup实体的情况下创建一个新的UserGroup实体(如下所示),它会阻止错误的发生,并返回数据,但当我实际上只想将其默认为null(就像在entity Framework中一样)而不必实例化新UserGroup对象时,这似乎是一个破解。

var users = from u in _session.Query<User>();
            select new
                   {
                       u.FirstName
                       u.LastName,
                       EmailAddress = (u.UserGroups.FirstOrDefault(x => x.Group.GroupId == id) ?? new UserGroup()).EmailAddress
                   }

有什么办法做到这一点吗?

在NHibernate LINQ中处理空值

试试这个:

var users = (from u in _session.Query<User>();
            select new
                   {
                       u.FirstName
                       u.LastName,
                       EmailAddress = u.UserGroups.Where(x => x.Group.GroupId == id)
                                                  .Select(x => x.EmailAddress)
                                                  .FirstOrDefault()
                   }).ToList();

首先用Where方法添加条件,然后用Select方法更改输出,只得到EmailAddress列,最后调用FirstOrDefault

使用前请记住检查EmailAddress是否不是null