tutorial net mvc example code asp c# mysql nhibernate linq-to-nhibernate

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(); }