【问题标题】:Nhibernate throws Object of type 'System.Linq.EnumerableQuery`1[Entity]' cannot be converted to type 'System.Linq.IQueryable`1[System.Object[]]'Nhibernate 抛出“System.Linq.EnumerableQuery`1[Entity]”类型的对象无法转换为“System.Linq.IQueryable`1[System.Object[]]”类型
【发布时间】:2013-07-16 16:28:50
【问题描述】:

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

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

例外:

“System.Linq.EnumerableQuery1[Entity]' cannot be converted to type 'System.Linq.IQueryable1[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(); 

【问题讨论】:

  • .AsQueryable() 可能是问题所在。另外为什么选择用户进入另一个用户? repo.GetAll().Where(f =&gt; f.Id == id).FirstOrDefault(); 应该够了吧?
  • .AsQueryable() might be the problem. 是。多谢。但我不明白这个问题

标签: c# linq nhibernate orm fluent-nhibernate


【解决方案1】:

.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

【讨论】:

    猜你喜欢
    • 2018-10-16
    • 2021-01-29
    • 1970-01-01
    • 2014-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-21
    • 1970-01-01
    相关资源
    最近更新 更多