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中吗?
问题一,是不是读取全部查询记录取决于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(''''')
给你顶一下~~~~~
给你顶一下~~~~~