c# - net - nhibernate mvc
Concatenación de cadena NHibernate/MySQL (2)
Tengo una consulta nhibernate linq que se ve así:
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
Esto explota, diciendo que Concat no es compatible, pero cuando lo cambio a
from b in session.Query<Bookmark>()
where b.Uri.Equals(uri) ||
b.Uri.Equals("www." + uri) ||
("www." + b.Uri).Equals(uri)
select b
Funciona bien, pero la consulta se ve así:
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'';
Donde el ''www.'' + Bookmark0_.Uri es "agregado" en lugar de concat (''www.'', Bookmark0_.Uri). ¿Hay alguna manera de concatenar cadenas en Linq para NHibernate para MySQL?
eso es porque concatination de dos tipos. Puede ser que puedas probar string.Concat ("www" + b.Uri.ToString);
El siguiente es un HqlGenerator que resuelve este problema:
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()
});
}
}
Agregue esto a su HQLGeneratorsRegistry y estará listo para realizar llamadas a string.Concat en sus declaraciones 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();
}