NHibernate / MySQL конкатенация строк - PullRequest
5 голосов
/ 24 мая 2011

У меня есть запрос 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';

Где вместо "concat" добавлено "www." + Bookmark0_.Uri ("www.", Bookmark0_.Uri). Есть ли способ объединить строки в Linq для NHibernate для MySQL?

Ответы [ 2 ]

6 голосов
/ 08 июня 2011

Ниже приведен 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, и вы будете хорошо относиться к вызовам string.Concat в ваших операторах 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();
}
0 голосов
/ 24 мая 2011

Вот потому, что конкатенация двух типов. Может быть, вы можете попробовать string.Concat ("www" + b.Uri.ToString);

...