首页 > 学院 > 开发设计 > 正文

NHibernate中的IQueryable和IQueryover

2019-11-15 02:27:17
字体:
来源:转载
供稿:网友

NHibernate中的IQueryable和IQueryover

2014-01-14 16:09 by 无眠, ... 阅读, ... 评论, 收藏, 编辑

今天在做一个小项目时,用到了NHibernate,使用了模糊查询(Like),在后台用IQueryable去接收session.Query<T>()的查询结果。

代码如下:

1         /// <summary>2         /// 获取所有记录3         /// </summary>4         /// <returns></returns>5         public virtual IQueryable<T> LoadAll()6         {7             var result = Session.Query<T>();8             return result;9         }

在BLL层想用NHibernate的Where去做模糊查询,查了好多资料可以有两种方式:

第一种:

  .Where(Restrictions.On<Cat>(c => c.Name).IsLike("%anna%"))

第二种:

  .WhereRestrictionOn(c => c.Name).IsLike("%anna%")

然后调用base.LoadAll(),但是base.LoadAll()后面的WhereRestrictionOn怎么也出不来,郁闷!!

在再试第一种方式,也不对。。。

休息一会,回来再看,原来底层函数的返回值是IQueryable,不是IQueryover。

IQueryover:是NHibernate类库中的一个接口,可以使用QueryOver查询。

IQueryable:是Linq中的一个接口,与NHibernate无关。

最后修改为Linq的语法Where(n=>n.Name.Contains(name))(原来这么简单!):

 1         /// <summary> 2         /// 获取用户 3         /// </summary> 4         /// <param name="count">总数</param> 5         /// <param name="pageIndex">页索引</param> 6         /// <param name="pageSize">页记录数</param> 7         /// <param name="name">搜索条件:用户名</param> 8         /// <returns></returns> 9         public IQueryable<User> LoadUserByName(out long count, int pageIndex, int pageSize, string name)10         {11             var result = base.LoadAll().Where(n=>n.Name.Contains(name));12             count = result.LongCount();13 14             return result.Skip((pageIndex - 1) * pageSize).Take(pageSize);15         }

查看生成的SQL语句:

1 2014-01-14 15:07:28,155 [55] INFO  NHibernate.Loader.Loader [(null)] <(null)> - select cast(count(*) as INTEGER) as col_0_0_ from T_User user0_ where user0_.Name like ('%'||@p0||'%')2 2014-01-14 15:07:28,159 [55] INFO  NHibernate.Hql.Ast.ANTLR.Tree.FromElement [(null)] <(null)> - handling PRoperty dereference [DomainModel.User (n) -> Name (Class)]3 2014-01-14 15:07:28,160 [55] INFO  NHibernate.Loader.Loader [(null)] <(null)> - select user0_.UserId as UserId0_, user0_.Name as Name0_, user0_.PassWord as Password0_, user0_.Telephone as Telephone0_, user0_.Email as Email0_, user0_.IsDeleted as IsDeleted0_ from T_User user0_ where user0_.Name like ('%'||@p0||'%') limit 10

总结:

1.没有对NHibernate的查询理解透;

2.对Linq的语法也不熟悉;

此处写下来,留作备注,下次参考。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表