• NHibernate中的IQueryable和IQueryover


    今天在做一个小项目时,用到了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的语法也不熟悉;

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

    
    
  • 相关阅读:
    ISO/IEC 9899:2011 条款5——5.2.2 字符显示语义
    ISO/IEC 9899:2011 条款5——5.2.1 字符集
    ISO/IEC 9899:2011 条款5——5.2 环境上的考虑
    nVidia GPGPU vs AMD Radeon HD Graphics执行模式对比
    ISO/IEC 9899:2011 条款5——5.1.2 执行环境
    ISO/IEC 9899:2011 条款5——5.1.1 翻译环境
    ISO/IEC 9899:2011 条款5——5.1 概念模型
    ISO/IEC 9899:2011 条款5——环境
    ISO/IEC 9899:2011 条款4——标准顺从
    php利用phpexcel导出数据
  • 原文地址:https://www.cnblogs.com/wumian1360/p/3519228.html
Copyright © 2020-2023  润新知