Nhibernate - 在 QueryOver.IsLike 中使用列值

本文关键字:IsLike QueryOver Nhibernate | 更新日期: 2023-09-27 17:57:09

我需要执行一个在SQL中大致如下所示的查询:

select * from Codes where Value1 like '%' + Value2 + '%'

有没有办法使用FluentNHibernate和QueryOver来做到这一点?我一直在寻找这样的东西

Session.Query<Code>().WhereRestrictionOn(c => c.Value1).IsLike(c => c.Value2);

但不幸的是,IsLike需要一个objectstring值作为参数。

Nhibernate - 在 QueryOver.IsLike 中使用列值

正如建议的那样,您可以使用SQL标准。不过,我会把它放在一个扩展方法中,所以如果你发现自己经常使用它,它会更可重用一些。像这样的东西...

    public static IQueryOver<TRoot, TSubType> WhereLike<TRoot, TSubType>(this IQueryOver<TRoot, TSubType> query, Expression<Func<TSubType, object>> thisLike, Expression<Func<TSubType, object>> likeThis)
    {
        var propName1 = ExpressionProcessor.FindMemberExpression(thisLike.Body);
        var propName2 = ExpressionProcessor.FindMemberExpression(likeThis.Body);
        query.Where(NHibernate.Criterion.Expression.Sql(string.Format(" {0} LIKE '%' + {1} + '%' ", propName1, propName2)));
        return query;
    }

这样使用

            var query = session.QueryOver<Code>()
                .WhereLike(thisLike => thisLike.Value1, likeThis => likeThis.Value2);

这里的一种方法是只使用原始SQL标准:

Session
    .Query<Code>()
    //.WhereRestrictionOn(c => c.Value1).IsLike(c => c.Value2);
    .Where(Expression.Sql(" Value1Column LIKE '%' + Value2Column + '%' "));

它表示原始 SQL,因此我们必须使用列名,而不是此处的映射属性......但对于这样的特殊情况,这是 NHibernate 扩展点