我需要在SQL中执行大致类似的查询:
select * from Codes where Value1 like '%' + Value2 + '%'
有没有办法使用FluentNHibernate和QueryOver
?我在寻找像这样的东西
Session.Query<Code>().WhereRestrictionOn(c => c.Value1).IsLike(c => c.Value2);
但遗憾的是IsLike
需要object
或string
值作为参数。
答案 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扩展点