NHibernate中的IQueryable和IQueryover
今天在做一个小项目时,用到了NHibernate,使用了模糊查询(Like),在后台用IQueryable去接收Session.Query<T>()的查询结果。
代码如下:
/// <summary>
/// 获取所有记录
/// </summary>
/// <returns></returns>
public virtual IQueryable<T> LoadAll()
{
var result = Session.Query<T>();
return result;
}
在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))(原来这么简单!):
/// <summary>
/// 获取用户
/// </summary>
/// <param name="count">总数</param>
/// <param name="pageIndex">页索引</param>
/// <param name="pageSize">页记录数</param>
/// <param name="name">搜索条件:用户名</param>
/// <returns></returns>
public IQueryable<User> LoadUserByName(out long count, int pageIndex, int pageSize, string name)
{
var result = base.LoadAll().Where(n=>n.Name.Contains(name));
count = result.LongCount(); return result.Skip((pageIndex - ) * pageSize).Take(pageSize);
}
查看生成的SQL语句:
2014-01-14 15:07:28,155 [] INFO NHibernate.Loader.Loader [(null)] <(null)> - select cast(count(*) as INTEGER) as col_0_0_ from T_User user0_ where user0_.Name like ('%'||@p0||'%')
2014-01-14 15:07:28,159 [] INFO NHibernate.Hql.Ast.ANTLR.Tree.FromElement [(null)] <(null)> - handling property dereference [DomainModel.User (n) -> Name (Class)]
2014-01-14 15:07:28,160 [] 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的语法也不熟悉;
此处写下来,留作备注,下次参考。
NHibernate中的IQueryable和IQueryover的更多相关文章
- NHibernate中,查询SqlServer数据库多个实体对象
关于datetime类型使用: Oracle: "and tb.EffectiveDate >= to_date(?,'yyyy-mm')" Sql: "an ...
- NHibernate 中删除数据的几种方法
今天下午有人在QQ群上问在NHibernate上如何根据条件删除多条数据,于是我自己就写了些测试代码,并总结了一下NHibernate中删除数据的方式,做个备忘.不过不能保证囊括所有的方式,如果还有别 ...
- NHibernate 中使用 nvarchar(max) 类型
在 NHibernate 中使用字符串类型,默认会映射到字符类型,在 SQLServer 中,NVARCHAR 类型最大长度是 4000 字符,如果超过 4000,比如使用 SQL Server 中的 ...
- Nhibernate中 Many-To-One 中lazy="proxy" 延迟不起作用的原因
2010-07-15 12:10 by 彭白洋, 322 阅读, 0 评论, 收藏, 编辑 NHibernate中 Many-To-One 中lazy="proxy" 延迟不起作用 ...
- [转]NHibernate之旅(7):初探NHibernate中的并发控制
本节内容 什么是并发控制? 悲观并发控制(Pessimistic Concurrency) 乐观并发控制(Optimistic Concurrency) NHibernate支持乐观并发控制 实例分析 ...
- [转]NHibernate之旅(6):探索NHibernate中的事务
本节内容 事务概述 1.新建对象 [测试成功提交] [测试失败回滚] 2.删除对象 3.更新对象 4.保存更新对象 结语 上一篇我们介绍了NHibernate中的Insert, Update, Del ...
- 为什么Nhibernate中属性和方法必须Virtual的
如果你曾经用过NHibernate 2.0或者更高的版本,那您一定碰到过下面的错误:NHibernate.InvalidProxyTypeException: The following types ...
- 总结NHibernate 中删除数据的几种方法
今天下午有人在QQ群上问在NHibernate上如何根据条件删除多条数据,于是我自己就写了些测试代码,并总结了一下NHibernate中删除数据的方式,做个备忘.不过不能保证囊括所有的方式,如果还有别 ...
- NHibernate中使用memcache二级缓存
在NHibernate中使用memcache二级缓存 一.Windows下安装Memcache 1. 下载 http://jehiah.cz/projects/memcached-win32/ ...
随机推荐
- 让人爱不释手的13套精美 Web 应用程序图标素材(转)
图标用于向用户传递信息,不管是在网页还是 Web 应用程序中都非常需要.这些小小的图标元素能够告诉用户怎么到下一页,如何添加.删除和取消等等各种操作.设计精美的图标不仅能增加界面的美观,也能够让应用程 ...
- weblogic配置数据源出错
Connection test failed. Listener refused the connection with the following error: ORA-12505, TNS:lis ...
- Lisp语言学习的书
Scheme <How to Design Programs : An Introduction to Programming and Computing>(<程序设计方法>) ...
- [King.yue]Ext.JS 弹出窗体取值赋值
//从Grid取值 var name = Ext.getCmp(gridGridID).getView().getSelectionModel().getSelection()[0].data.Nam ...
- ORM Entities vs. Domain Entities under Entity Framework 6.0
I stumbled upon the following two articles First and Second in which the author states in summary th ...
- 使用C#模拟ASP.NET页面中按钮点击
c# 模拟Asp.net页面中的某个按钮的点击,向web服务器发出请求 主要就组织要提交的数据,然后以post方式提交. 假设我们有如下的网页 1 <% @ Page Language = &q ...
- lua使用优化建议
1.使用局部变量local 这是最基础也是最有用的策略,虽然使用全局变量并不能完全避免,但还是应该尽量避免,取而代之使用局部变量即local.这里的局部变量也包括函数function,因为在Lua里函 ...
- HW3.23
import java.util.Scanner; public class Solution { public static void main(String[] args) { Scanner i ...
- CentosX64使用yum快速搭建xen虚拟化环境
Xen的大名想必已经被众SA所熟知.Xen 是一个开放源代码虚拟机监视器,由剑桥大学开发.它打算在单个计算机上运行多达100个满特征的操作系统.操作系统必须进行显式地修改(“移植”)以在Xen上运行( ...
- ios 添加到cell 上的button点击无效!扩大button的点击区域(黑魔法)
一般情况下点击效果都是正常的!要不然你对它做了什么?一般细心的小伙伴都没有遇到这种情况,但是呢! 当然我是二班的!在这里我主要讲两个问题,解决问题和普及魔法. 一.普及问题(button在cell上点 ...