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扩展的更多相关文章

  1. NHibernate系列文章二十四:NHibernate查询之Linq查询(附程序下载)

    摘要 NHibernate从3.0开始支持Linq查询.写Linq to NHibernate查询就跟写.net linq代码一样,非常灵活,可以很容易实现复杂的查询.这篇文章使用Linq to NH ...

  2. Linq扩展方法之Aggregate 对序列应用累加器函数

    Linq扩展方法之Aggregate  对序列应用累加器函数; 函数模板:// 函数名:对序列应用累加器函数. // Parameters:参数要求 // source:要聚合的 System.Col ...

  3. LINQ之路(3):LINQ扩展

    本篇文章将从三个方面来进行LINQ扩展的阐述:扩展查询操作符.自定义查询操作符和简单模拟LINQ to SQL. 1.扩展查询操作符 在实际的使用过程中,Enumerable或Queryable中的扩 ...

  4. 【手记】走近科学之为什么明明实现了IEnumerable<T>的类型却不能调用LINQ扩展方法

    比如Json.NET的JObject明明实现了IEnumerable<T>,具体来说是IEnumerable<KeyValuePair<string, JToken>&g ...

  5. 用LinQ扩展方法,泛型扩展方法,实现自定义验证字符是否空、对象是否为null,及泛型约束使用,Action的使用

    一.Linq扩展方法 1.扩展方法必须是静态方法.扩展方法所在的类必须是静态类 2.扩展方法里面的参数必须制定this关键字,紧跟需要扩展的类型,如下: 二.泛型约束 1.使用泛型的原因,是在不知道需 ...

  6. ABP框架源码中的Linq扩展方法

    文件目录:aspnetboilerplate-dev\aspnetboilerplate-dev\src\Abp\Collections\Extensions\EnumerableExtensions ...

  7. Linq扩展最后遗留之SelectMany,Zip,SequenceEqual源码分析

    Linq扩展最后遗留之SelectMany,Zip,SequenceEqual源码分析 一: AsParallel [并行化查询] 这个函数的功效就是将计算结果多线程化.[并行计算] =>[多核 ...

  8. 【手记】走近科学之为什么JObject不能调用LINQ扩展方法

    Json.NET的JObject明明实现了IEnumerable<T>,具体来说是IEnumerable<KeyValuePair<string, JToken>> ...

  9. LinQ—扩展方法

    概述 本节主要解说扩展方法,涉及LinQ的详细知识不多. 扩展方法的描写叙述 .net framework为编程人员提供了非常多的类,非常多的方法,可是,不论.net framework在类中为我们提 ...

随机推荐

  1. 在WebView中如何让JS与Java安全地互相调用

    在现在安卓应用原生开发中,为了追求开发的效率以及移植的便利性,使用WebView作为业务内容展示与交互的主要载体是个不错的折中方案.那么在这种Hybrid(混合式) App中,难免就会遇到页面JS需要 ...

  2. Linq 语法举例

    1.简单的linq语法 //1 var ss = from r in db.Am_recProScheme select r; //2 var ss1 = db.Am_recProScheme; // ...

  3. 点击按钮弹出div,留用

    <input type="button" onclick="document.getElementById('div').style.display=(docume ...

  4. 拿到手机ip住址

    转载自:http://blog.csdn.net/showhilllee/article/details/8746114 貌似ASI里获取ip地址的链接不能够了.也曾试过whatismyip,在其站点 ...

  5. C# winform 加载网页 模拟键盘输入自动接入访问网络

    声明: 本文原创,首发于博客园 http://www.cnblogs.com/EasyInvoice/p/6070563.html 转载请注明出处. 背景: 由于所在办公室网络限制,笔者每天都使用网络 ...

  6. spring05配置文件之间的关系

    一:配置文件包含关系 1.创建对应的实体类 public class Student { //学生实体类 private String name; //姓名 private Integer age; ...

  7. poj 2823 Sliding Window(单调队列)

    /* 裸地单调队列.. 第一次写 写的好丑.... */ #include<iostream> #include<cstdio> #include<cstring> ...

  8. 第1章 你真的了解C#吗?

    什么是C#? C#是由微软公司开发的一种面向对象且运行于.Net Framework之上的高级程序设计语言,发布于2000年6月. 什么是.Net Framework 我们可以这样去理解.Net Fr ...

  9. C# 面向对象 , 继承

    继承 class A { Console.WriteLine("hello world"); } class B:A { } 以上书写,表示B 是A 的子类,  B 同时继承A 中 ...

  10. JAVA File转Byte[]

    /** * 获得指定文件的byte数组 */ public static byte[] getBytes(String filePath){ byte[] buffer = null; try { F ...