Isa*_*ger 2 nhibernate linq-to-nhibernate nhibernate-4
为了利用 MariaDB 10 上的全文索引,我需要在 sql 字符串中使用这个新的“MATCH AGAINST”语法。
http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html#function_match
我认为如果仅对于某些列,我可以覆盖 linq-to-nhibernate 以更改它在使用时生成的 sql,那将会非常酷
.Where(x => FullTextIndexedStringProperty.Contains("Some word")).ToList().
Run Code Online (Sandbox Code Playgroud)
谁能给我一些关于如何开始的一般指导?
这将为您提供一个非常简单的MATCH ... AGAINST条款。如果您想变得更复杂(更多参数,指定搜索修饰符),您必须进行一些更大的更改。希望这会让你开始:
创建一个新方言并注册一个简单的MATCH (...) AGAINST (...)函数:
public class CustomMySQLDialect : MySQLDialect
{
public CustomMySQLDialect()
{
this.RegisterFunction(
"matchagainst",
new SQLFunctionTemplate(
NHibernateUtil.Boolean,
"match (?1) against (?2)"));
}
}
Run Code Online (Sandbox Code Playgroud)创建一个string您将在 LINQ 语句中使用的静态扩展方法:
public static class LinqExtensions
{
public static bool MatchAgainst(this string source, string against)
{
throw new NotImplementedException();
}
}
Run Code Online (Sandbox Code Playgroud)创建一个新的 LINQ to HQL 生成器类,将方法与我们在自定义方言中注册的 SQL 函数相关联:
public class MatchAgainstGenerator : BaseHqlGeneratorForMethod
{
public MatchAgainstGenerator()
{
this.SupportedMethods = new[]
{
ReflectionHelper.GetMethod(() => LinqExtensions.MatchAgainst(null, null))
};
}
public override HqlTreeNode BuildHql(
MethodInfo method,
System.Linq.Expressions.Expression targetObject,
ReadOnlyCollection<System.Linq.Expressions.Expression> arguments,
HqlTreeBuilder treeBuilder,
IHqlExpressionVisitor visitor)
{
return treeBuilder.BooleanMethodCall(
"matchagainst",
arguments.Select(visitor.Visit).Cast<HqlExpression>());
}
}
Run Code Online (Sandbox Code Playgroud)创建自定义 LinqToHqlGeneratorsRegistry:
public class MyLinqToHqlRegistry : DefaultLinqToHqlGeneratorsRegistry
{
public MyLinqToHqlRegistry()
{
var generator = new MatchAgainstGenerator();
RegisterGenerator(typeof(LinqExtensions).GetMethod("MatchAgainst"), generator);
}
}
Run Code Online (Sandbox Code Playgroud)在 cfg.xml 文件或代码中使用自定义方言和 Linq to HQL 注册表:
var cfg = new Configuration()
.DataBaseIntegration(db =>
{
db.Dialect<CustomMySQLDialect>();
})
.LinqToHqlGeneratorsRegistry<MyLinqToHqlRegistry>();
Run Code Online (Sandbox Code Playgroud)最后,在 LINQ-to-NHibernate 查询中使用您的扩展方法:
session.Query<Article>()
.Where(a => a.Body.MatchAgainst("configured"))
.ToList()
.Dump();
Run Code Online (Sandbox Code Playgroud)
这将生成如下所示的 SQL:
public class CustomMySQLDialect : MySQLDialect
{
public CustomMySQLDialect()
{
this.RegisterFunction(
"matchagainst",
new SQLFunctionTemplate(
NHibernateUtil.Boolean,
"match (?1) against (?2)"));
}
}
Run Code Online (Sandbox Code Playgroud)同样,如果您有更复杂的要求,这将无济于事。但希望这至少是一个好的起点。
如果有人对如何使这种支持更复杂的场景感到好奇,我认为您会遇到以下问题:
MATCH的那些AGAINST。| 归档时间: |
|
| 查看次数: |
796 次 |
| 最近记录: |