nhibernate 3.3 linq扩展
nhibernate的sqlserver linq 全文检索搞了半天
方法一 ,扩展LinqToHqlGeneriatorsRegistry
http://www.cnblogs.com/xiarugu/archive/2012/06/02/nhiberate-linq-contains-freetext-search.html
http://www.cnblogs.com/lyj/archive/2010/08/11/inside-nh3-linq-extension-query.html
搞了半天都不行,后来找到
http://stackoverflow.com/questions/16318843/is-there-a-query-generator-or-extension-point-for-queryover-like-there-is-for-li
才知道 3.3 换了,query和queryover走的不是一条路。
Linq and QueryOver take different paths to sql:
QueryOver->Expression->Criteria \
Linq->LinqParser->Hql-->Sql
for Criteria there is NHibernate.Impl.ExpressionProcessor.RegisterCustomMethodCall(...);
弄半天 找到 nhibernate代码才知道怎么注册。。。。郁闷的心情啊。
https://github.com/nhibernate/nhibernate-core/blob/612d1b6874a0067f1a9ff1f052ad90f12ce21f1c/src/NHibernate/Criterion/RestrictionsExtensions.cs
https://github.com/nhibernate/nhibernate-core/blob/612d1b6874a0067f1a9ff1f052ad90f12ce21f1c/src/NHibernate/Criterion/RestrictionsExtensions.cs
最后,在人家基础上改的。。。
/// <summary>
/// 扩展queryover
/// </summary>
public static class QueryOverExtensions
{
public static void Register()
{
ExpressionProcessor.RegisterCustomProjection(() => QueryOverExtensions.Day(default(DateTime)), QueryOverExtensions.ProcessDay);
ExpressionProcessor.RegisterCustomProjection(() => QueryOverExtensions.Month(default(DateTime)), QueryOverExtensions.ProcessMonth);
ExpressionProcessor.RegisterCustomProjection(() => QueryOverExtensions.Year(default(DateTime)), QueryOverExtensions.ProcessYear);
ExpressionProcessor.RegisterCustomMethodCall(() => QueryOverExtensions.MyIsLike(string.Empty, string.Empty), QueryOverExtensions.ProcessIsLike);
ExpressionProcessor.RegisterCustomMethodCall(() => QueryOverExtensions.ContainsSearch(string.Empty, string.Empty), QueryOverExtensions.ProcessContainsSearch);
} public static bool MyIsLike(this string source, string pattern)
{
throw new Exception("QueryOverExtensions MyIsLike 只有数据库操作可用");
} /// <summary>
/// 执行like操作
/// </summary>
/// <param name="methodCallExpression"></param>
/// <returns></returns>
private static ICriterion ProcessIsLike(MethodCallExpression methodCallExpression)
{
ExpressionProcessor.ProjectionInfo projection = ExpressionProcessor.FindMemberProjection(methodCallExpression.Arguments[]);
var values = (string)ExpressionProcessor.FindValue(methodCallExpression.Arguments[]);
return Expression.Sql(string.Format("{0} like '{1}'",projection.AsProjection(), values));
} /// <summary>
/// 对字段进行模式搜索
/// </summary>
/// <param name="source"></param>
/// <param name="keyword">关键字</param>
/// <returns></returns>
public static bool ContainsSearch(this string source, string keyword)
{
throw new NotSupportedException("仅用于数据库搜索");
} private static ICriterion ProcessContainsSearch(MethodCallExpression methodCallExpression)
{
ExpressionProcessor.ProjectionInfo projection = ExpressionProcessor.FindMemberProjection(methodCallExpression.Arguments[]);
string values = (string)ExpressionProcessor.FindValue(methodCallExpression.Arguments[]);
return Expression.Sql(string.Format("contains( {0},'{1}')", projection.AsProjection(), values));
} public static Int32 Day(this DateTime dateTimeProperty)
{
return (dateTimeProperty.Day);
} public static Int32 Month(this DateTime dateTimeProperty)
{
return (dateTimeProperty.Month);
} public static Int32 Year(this DateTime dateTimeProperty)
{
return (dateTimeProperty.Year);
} private static IProjection ProcessDay(MethodCallExpression methodCallExpression)
{
IProjection property = ExpressionProcessor.FindMemberProjection(methodCallExpression.Arguments[]).AsProjection();
return (Projections.SqlFunction("day", NHibernateUtil.Int32, property));
} private static IProjection ProcessMonth(MethodCallExpression methodCallExpression)
{
IProjection property = ExpressionProcessor.FindMemberProjection(methodCallExpression.Arguments[]).AsProjection();
return (Projections.SqlFunction("month", NHibernateUtil.Int32, property));
} private static IProjection ProcessYear(MethodCallExpression methodCallExpression)
{
IProjection property = ExpressionProcessor.FindMemberProjection(methodCallExpression.Arguments[]).AsProjection();
return (Projections.SqlFunction("year", NHibernateUtil.Int32, property));
}
yy.QueryOver<xxx>().Where(c=>c.text.ContainsSearch("xx")).List();
yy.QueryOver<xxx>().Where(c=>c.text.MyIsLike("xx")).List();
yy.QueryOver<xxx>().Where(c=>c.dataime.Day()==DateTime.Now.Day).List();
最后===如果你还想偷懒点用
var query = QueryOver.Of<XXXXX>();
var qstr=" 1=1 and Contains(XXXX,'xxx')"
query.DetachedCriteria.Add( Expression.Sql(string.Format(qstr)));
nhibernate 3.3 linq扩展的更多相关文章
- NHibernate系列文章二十四:NHibernate查询之Linq查询(附程序下载)
摘要 NHibernate从3.0开始支持Linq查询.写Linq to NHibernate查询就跟写.net linq代码一样,非常灵活,可以很容易实现复杂的查询.这篇文章使用Linq to NH ...
- Linq扩展方法之Aggregate 对序列应用累加器函数
Linq扩展方法之Aggregate 对序列应用累加器函数; 函数模板:// 函数名:对序列应用累加器函数. // Parameters:参数要求 // source:要聚合的 System.Col ...
- LINQ之路(3):LINQ扩展
本篇文章将从三个方面来进行LINQ扩展的阐述:扩展查询操作符.自定义查询操作符和简单模拟LINQ to SQL. 1.扩展查询操作符 在实际的使用过程中,Enumerable或Queryable中的扩 ...
- 【手记】走近科学之为什么明明实现了IEnumerable<T>的类型却不能调用LINQ扩展方法
比如Json.NET的JObject明明实现了IEnumerable<T>,具体来说是IEnumerable<KeyValuePair<string, JToken>&g ...
- 用LinQ扩展方法,泛型扩展方法,实现自定义验证字符是否空、对象是否为null,及泛型约束使用,Action的使用
一.Linq扩展方法 1.扩展方法必须是静态方法.扩展方法所在的类必须是静态类 2.扩展方法里面的参数必须制定this关键字,紧跟需要扩展的类型,如下: 二.泛型约束 1.使用泛型的原因,是在不知道需 ...
- ABP框架源码中的Linq扩展方法
文件目录:aspnetboilerplate-dev\aspnetboilerplate-dev\src\Abp\Collections\Extensions\EnumerableExtensions ...
- Linq扩展最后遗留之SelectMany,Zip,SequenceEqual源码分析
Linq扩展最后遗留之SelectMany,Zip,SequenceEqual源码分析 一: AsParallel [并行化查询] 这个函数的功效就是将计算结果多线程化.[并行计算] =>[多核 ...
- 【手记】走近科学之为什么JObject不能调用LINQ扩展方法
Json.NET的JObject明明实现了IEnumerable<T>,具体来说是IEnumerable<KeyValuePair<string, JToken>> ...
- LinQ—扩展方法
概述 本节主要解说扩展方法,涉及LinQ的详细知识不多. 扩展方法的描写叙述 .net framework为编程人员提供了非常多的类,非常多的方法,可是,不论.net framework在类中为我们提 ...
随机推荐
- postgres中的merge join
目前数据库中的join操作 无非三种 nextloop merge hash 本文分析pg的merge join 不得不说pg真是学习数据库实现的好东西 不愧是学院派 用来教学的 代码写的干净注释清晰 ...
- HDU 2853 Assignment(KM最大匹配好题)
HDU 2853 Assignment 题目链接 题意:如今有N个部队和M个任务(M>=N),每一个部队完毕每一个任务有一点的效率,效率越高越好.可是部队已经安排了一定的计划,这时须要我们尽量用 ...
- url参数中有+、空格、=、%、&、#等特殊符号的处理
url参数中有+.空格.=.%.&.#等特殊符号的问题解决? 解决办法: 将这些字符转化成服务器可以识别的字符,对应关系如下: URL字符转义 + URL 中+号表示空格 %2B 空格 URL ...
- OpenStack Neutron DVR L2 Agent的初步解析 (一)
声明: 本博客欢迎转载,但请保留原作者信息! 作者:林凯 团队:华为杭州OpenStack团队 OpenStack Juno版本号已正式公布,这是这个开源云平台的10个版本号,在Juno版的Neutr ...
- iscc2016 pwn部分writeup
一.pwn1 简单的32位栈溢出,定位溢出点后即可写exp gdb-peda$ r Starting program: /usr/iscc/pwn1 C'mon pwn me : AAA%AAsAAB ...
- codevs 4827 妹子
/* 赤裸裸的数学题 各种整体+插空 所以嘛 学好数学还是很重要的 ans=(n-1)!*(m-1)!*(2+(n-2)(n-1)) */ #include<iostream> #incl ...
- python的按位运算
#coding=utf-8#"&"按位与运算,是指一个数字转化为二进制,然后这些二进制的数按位来进行与运算a=7&18print a'''首先将7转化为二进制,得到 ...
- XML数据的读取—数据库配置文件
数据库配置文件(config.xml) <?xml version="1.0" encoding="utf-8"?> <configurati ...
- mongodb权威指南读书笔记
一个服务器能不能运行多个不同端口的mongo实例? 如果两个对象不相等,hashcode一定不相等:如果两个对象相等,hashcode相等或者不相等? 修改器速度42页 update({},{&quo ...
- Excel连接字符串(Oledb)
Excel的连接字符串参数详解 2011-07-27 15:43:50| 分类: 编程专栏 | 标签:excel 连接字符串 参数 含义 |字号大中小 订阅 程序中读取Excel ...