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
需要一个object
或string
值作为参数。
正如建议的那样,您可以使用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 扩展点