Nhibernate - 在QueryOver.IsLike中使用列值

时间:2015-06-19 08:54:17

标签: c# nhibernate queryover

我需要在SQL中执行大致类似的查询:

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

有没有办法使用FluentNHibernate和QueryOver?我在寻找像这样的东西

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

但遗憾的是IsLike需要objectstring值作为参数。

2 个答案:

答案 0 :(得分:4)

根据建议您可以使用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);

答案 1 :(得分:1)

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

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

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