NHibernate/MySQL字符串连接
本文关键字:连接 字符串 MySQL NHibernate | 更新日期: 2023-09-27 17:57:23
我有一个 nhibernate linq 查询,如下所示:
from b in session.Query<Bookmark>()
where b.Uri.Equals(uri) ||
b.Uri.Equals("www." + uri) ||
string.Concat("www.", b.Uri).Equals(uri)
select b
这爆炸了,说 Concat 不支持,但是当我将其更改为
from b in session.Query<Bookmark>()
where b.Uri.Equals(uri) ||
b.Uri.Equals("www." + uri) ||
("www." + b.Uri).Equals(uri)
select b
它运行良好,但查询如下所示:
select cast(count(*) as SIGNED) as col_0_0_
from bookmarks bookmark0_
where bookmark0_.Uri = 'www.google.com'
or bookmark0_.Uri = 'www.www.google.com'
or 'www.'+bookmark0_.Uri = 'www.google.com';
其中"万维网"。+bookmark0_.Uri 是"add"而不是 concat('www.',bookmark0_。乌里)。 有没有办法在Linq for NHibernatefor MySQL中连接字符串?
下面是一个可以解决此问题的 HqlGenerator:
public class ConcatHqlGenerator : BaseHqlGeneratorForMethod
{
public ConcatHqlGenerator()
: base()
{
this.SupportedMethods = new[]
{ ReflectionHelper.GetMethodDefinition(() => string.Concat(null, null)) };
}
public override HqlTreeNode BuildHql(MethodInfo method,
Expression targetObject,
ReadOnlyCollection<Expression> arguments,
HqlTreeBuilder treeBuilder,
IHqlExpressionVisitor visitor)
{
return treeBuilder.Concat(
new[]
{
visitor.Visit(arguments[0]).AsExpression(),
visitor.Visit(arguments[1]).AsExpression()
});
}
}
将其添加到您的 HQLGeneratorsRegistry 中,您将很高兴使用对字符串的调用。在 LINQ 语句中连接。
public class LinqToHqlGeneratorsRegistry : DefaultLinqToHqlGeneratorsRegistry
{
public LinqToHqlGeneratorsRegistry()
: base()
{
this.Merge(new ConcatHqlGenerator());
}
}
private static ISessionFactory CreateSessionFactory()
{
var configuration = new NHib.Cfg.Configuration();
configuration.Properties.Add(NHibernate.Cfg
.Environment.LinqToHqlGeneratorsRegistry,
typeof(LinqToHqlGeneratorsRegistry).AssemblyQualifiedName);
configuration.Configure();
return configuration.BuildSessionFactory();
}
那是因为两种类型的连接。也许你可以试试字符串。Concat("www" + b.Uri.ToString);