NHibernate的抛出类型的对象'System.Linq.EnumerableQuery`1 [实体]“不能转换为类型'System.Linq.IQueryable`1 [System.Object的[]' [英] Nhibernate throws Object of type 'System.Linq.EnumerableQuery`1[Entity]' cannot be converted to type 'System.Linq.IQueryable`1[System.Object[]]'

查看:458
本文介绍了NHibernate的抛出类型的对象'System.Linq.EnumerableQuery`1 [实体]“不能转换为类型'System.Linq.IQueryable`1 [System.Object的[]'的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

使用NHibernate作为ORM

试图让一个实体

  VAR用户= GetUsersData(资料库); 
返回users.Where(F => f.Id == ID).FirstOrDefault(); //有一个例外

例外:




类型的对象'System.Linq.EnumerableQuery 1 [实体]'不能为
转换为类型'System.Linq.IQueryable
1 [System.Object的[]'。




但是当我这样做的:

  VAR用户= GetUsersData(资料库); 
返回users.Where中(f => f.Id ==内径).ToArray()FirstOrDefault();



运行良好。 ?
指向了我,什么是错的。



GetUsersData 我做的:

 私有静态的IQueryable<使用者> GetUsersData(IUserRepository库)
{
返回repo.GetAll()选择(USER =方式>新用户
{
n = user.Id,
=手机user.Phones.Select(S = GT;新手机(){数= s.Number}),

})AsQueryable已()。


解决方案

.AsQueryable()将包装从NH指定的IQueryable不必要进入一个新的可查询,但由于NH将默认使用对象数组作为结果,后来改造它,它就会失败铸造。



另外选择用户到另一个用户将防止changetracking和不用复制。

  repo.GetAll()(凡F => f.Id ==内径).FirstOrDefault();应该足够



甚至更好,因为sessioncache使用


$ B的$ b

  VAR用户= session.Get<使用者>(ID); 
如果(用户== NULL)
//给定标识的用户不存在


using nhibernate as ORM
Trying to get one entity

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

exception:

Object of type 'System.Linq.EnumerableQuery1[Entity]' cannot be converted to type 'System.Linq.IQueryable1[System.Object[]]'.

but when i do it that way:

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

it runs fine. Point me, what's wrong?

in GetUsersData i do :

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() will wrap the given IQueryable from NH needlessly into a new Queryable but since NH will by default use object arrays as results and transform it later it will fail casting.

Also Selecting the user into another User will prevent changetracking and is needless copying.

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

or even better because of the sessioncache usage

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

这篇关于NHibernate的抛出类型的对象'System.Linq.EnumerableQuery`1 [实体]“不能转换为类型'System.Linq.IQueryable`1 [System.Object的[]'的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆