首页 新闻 会员 周边 捐助

关于NHIbernate的性能

1
悬赏园豆:50 [已解决问题] 解决于 2013-08-15 14:54

private IQueryable<T> BuildQuery(Expression<Fun<T,bool>> specification)
        {
            IQueryable<T> data = Session.Query<T>();
            if (filterSpecification != null)
            data = data.Where(filterSpecification.IsSatisfiedBy());
            return data;
        }
这段代码好像是,将数据库中的所有记录(对象)读取到Queryable集合中,然后再根据表达式树从集合中筛选出符合要求的记录? 如果NHIbernate设置了延迟加载的话,也是这样吗?如果有1万条数据,也要全部加载到内存中吗?

问题2: 关于NHIbernate的性能
由于NHibernate是基于面向对象的ORM框架,处理数据库的方式是针对单个对象的。对数据库的增、删、改都是正对一条记录而言。对于批量修改、删除数据,不适合用NHiberante。这也是所有OR框架弱点,其原因,我认为是在于与缓存机制的冲突。

这句话怎么理解?为什么说,所有的ORM工具都不适用于批量操作呢?这里的批量,是指删除的时候,删除一个List吗?在使用Nhibernate的时候,用循环一个个的对象删除,但是这是一个session中,也就是一个connection中。在ADO.NET中,不也是一个connection中吗?

Robin_Null的主页 Robin_Null | 初学一级 | 园豆:157
提问于:2013-05-23 15:05
< >
分享
最佳答案
0

问题一,是不是读取全部查询记录取决于Queryable后边有没有加条件限制,如:

Expression<Func<object, bool>> filter = w => w.ID <10;
data.Where(filter);

这样就只会读取9条记录出来

 

问题二,举一个批量删除的例子,如:

for (int i = 0; i < arr.Length; i++)
{
   var entity = Session.Get<T>(arr[i]);
   Session.Delete(T);
}

这样每个对象删除之前都要先获取,

如果用ADO.NET的话直接就 delete table where id in(''''')

收获园豆:50
ljr忒修斯之船 | 初学一级 |园豆:182 | 2013-06-20 17:12
其他回答(2)
0

给你顶一下~~~~~

牵着你的手不放 | 园豆:214 (菜鸟二级) | 2013-05-23 16:50
0

给你顶一下~~~~~

数据酷软件 | 园豆:130 (初学一级) | 2013-05-24 11:50
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册