3

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

1 回答 1

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
于 2013-07-16T08:28:50.100 回答