Nhibernate抛出'System.Linq.EnumerableQuery`1 [Entity]'类型的对象无法转换为类型'System.Linq.IQueryable`1 [System.Object []]'

时间:2013-07-15 08:27:27

标签: c# linq nhibernate orm fluent-nhibernate

使用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(); 

1 个答案:

答案 0 :(得分:2)

.AsQueryable()会将来自NH的给定IQueryable不必要地包装到一个新的Queryable中,但由于NH默认使用对象数组作为结果并在以后转换它将失败。

另外,将用户选择为另一个用户将阻止更改,并且无需复制。

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

甚至更好,因为sessioncache使用

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