10分钟搞定Linq to NHibernate(二)——查询篇

有人问过我一个问题,既然用了NHibernate还有必要用Linq吗?就这个问题,我回答下列几点:

  1.Linq to NHibernate有VS的IDE提示,编译器可以帮助我提示出错误。

  2.Linq to NHibernate最大限度的帮我们优化SQL语句,尤其是匿名类的查询语句和聚合函数的查询。

  3.可以结合Linq加NHibernate各自的延迟加载特性,帮我们在必要的时候生成特定的SQL语句。

  4.统一语言,必要的时候不用学习HQL来增加学习成本。

  5.方便于满足复杂查询的需求(如报表)。

然而对上述观点我提出如下建议:

  1.建议映射文件*.hbm.xml文件的lazy="true"来开启延迟加载。

  2.数据库访问对象(Dao)类的返回值建议使用IQueryable<T>泛型类型或者IQueryable接口

 

以下是Linq to NHibernate查询语句的代码。

 

 

 

ProductsDao

 

 

从上述代码,我可以看到Linq to NHibernate查询语句和SQL语句的对照。

 代码下载

posted @ 2009-10-18 23:48 刘冬.NET 阅读(4123) 评论(7) 编辑 收藏

 回复 引用 查看   
#1楼 2009-10-19 00:21 XinXin_Shine      
喜欢Linq的所有,也喜欢NHibernate,也喜欢Silverlight,也喜欢ASP.NET MVC,呵呵!
 回复 引用 查看   
#2楼[楼主] 2009-10-19 00:26 落花吹雪      
same 2 u,我最近在研究mvc+sring.net+nhibernate的组合,模仿java的ssh
 回复 引用 查看   
#3楼 2009-10-19 12:01 麦舒      
Linq to NHiberate 效率如何???
 回复 引用 查看   
#4楼[楼主] 2009-10-19 12:09 落花吹雪      
实质就是动态生成hql的效率。我觉得效率瓶颈在于io操作,Linq to NHiberate只是扩展或者封装了Criteria,效率比直接用hql相差不大,使用Linq to NHiberate是为了方便,我个人认为谈效率没有意义。
这实际上跟Linq to Object有区别吗?

没区别呀.学习曲线不会很陡.

我最近也在研究mvc,sring.net,nhibernate的组合.

再加上Linq to xml,mvc

再加上Unity,EF,mvc

做好了,通知楼主.

 回复 引用 查看   
#6楼[楼主] 2009-10-25 09:38 落花吹雪      
引用我是一只小老虎 喵!:
这实际上跟Linq to Object有区别吗?

没区别呀.学习曲线不会很陡.

我最近也在研究mvc,sring.net,nhibernate的组合.

再加上Linq to xml,mvc

再加上Unity,EF,mvc

做好了,通知楼主.


我认为与Linq to Object区别很大,
Linq to NHibernate充分发挥了Linq的延迟加载特性(调用时生成sql语句)。就那分页来说,Linq to NHibernate是在数据库实现的分页,而不是在内存里分页。Linq to NHibernat是简化了HQL,是代替HQL的一种途径。

 回复 引用 查看   
#7楼 2010-09-26 15:34 梦.夜帝      
public virtual IQueryable<T> FindAll(PropertyInfo sort, string dir)
{
if (sort == null) throw new ArgumentNullException("sort");
if (dir == null) throw new ArgumentNullException("dir");

var source = this.Session.Linq<T>();

string sortingDir = (dir.ToUpper().Trim() == "ASC") ? "OrderBy" : "OrderByDescending";

ParameterExpression paramOrderBy = Expression.Parameter(typeof(T), sort.Name);
Expression exprOrderBy = Expression.Call(typeof(Queryable), sortingDir,
new Type[] { typeof(T), sort.PropertyType },
source.Expression, Expression.Lambda(Expression.Property(paramOrderBy, sort.Name), paramOrderBy));
IQueryable<T> query = source.Provider.CreateQuery<T>(exprOrderBy);

return query;
}
这个方法不是很会调用,PropertyInfo sort, string dir这两个参数在外面要怎样定义??