Nhibernate抛出类型为';System.Linq.EnumerableQuery`1[实体]';无法

本文关键字:无法 实体 EnumerableQuery System 类型 Nhibernate Linq | 更新日期: 2023-09-27 18:22:16

使用nhibernate作为ORM
试图获得一个实体

   var users = GetUsersData(repository);
   return users.Where(f => f.Id == id).FirstOrDefault();//there is an exception

异常:

类型为"System.Linq.EnumerableQuery 1[Entity]' cannot be converted to type 'System.Linq.IQueryable 1[System.Object[]"的对象。

但当我这样做的时候:

var users = GetUsersData(repository);
return users.Where(f => f.Id == id).ToArray().FirstOrDefault();

它运行良好。指着我,怎么了?

GetUsersData中我做:

private static IQueryable<User> GetUsersData(IUserRepository repository)
        {
            return repo.GetAll().Select(user => new User
                {
                    Id = user.Id,
                    Phones = user.Phones.Select(s => new Phone() { Number = s.Number }),
                    ...
                }).AsQueryable(); 

Nhibernate抛出类型为';System.Linq.EnumerableQuery`1[实体]';无法

.AsQueryable()将不必要地将给定的IQueryable从NH包装到一个新的Queryable中,但由于NH默认情况下将使用对象数组作为结果,并在稍后对其进行转换,因此它将无法进行强制转换。

此外,将用户选择为另一个用户将阻止更改跟踪,并且是不必要的复制。

repo.GetAll().Where(f => f.Id == id).FirstOrDefault(); should be enough

或者由于会话缓存使用而变得更好

var user = session.Get<User>(id);
if (user == null)
    // user with given Id does not exist