在NHibernate中,当使用Criteria API执行Like语句时,我有类似的东西:
query.Add(Restrictions.InsensitiveLike(Projections.Property<Order>(a => a.OrderId1), OrderId2, MatchMode.Anywhere));
其中Order2只是一个本地字符串参数。 (您可以将Order2替换为“AB10002”)
这会创建一个这样的查询:
...WHERE Order.OrderId1 LIKE '%OrderId2%'
但我也想检查一下:
... OR OrderId2 LIKE'%Order.OrderID1%'
这甚至可能吗?
* Like限制不允许将投影属性作为第二个参数,这就是为什么我不知道如何“反转”之类的原因。
答案 0 :(得分:0)
你可以链接Add
,或者你应该能够Restrictions.Or
使用两个InsensitiveLike
:
query.Add(Restrictions.InsensitiveLike(Projections.Property<Order>(a => a.OrderId1), OrderId2, MatchMode.Anywhere))
.Add(Restrictions.InsensitiveLike(Projections.Property<Order>(a => a.OrderId2), OrderId1, MatchMode.Anywhere));
// ... or ...
query.Add(
Restrictions.Or(
Restrictions.InsensitiveLike(Projections.Property<Order>(a => a.OrderId1), OrderId2, MatchMode.Anywhere,
Restrictions.InsensitiveLike(Projections.Property<Order>(a => a.OrderId2), OrderId1, MatchMode.Anywhere
)
);
我目前无法对此进行测试,但是从记忆中我就是这样做的。
编辑:在回复您的评论时,您可以放弃类型安全API并使用一些字符串。 Expression.Like方法有一个字符串值属性名称的重载..可能是这样的?:
query.Add(Restrictions.InsensitiveLike(Projections.Property<Order>(a => a.OrderId1), OrderId2, MatchMode.Anywhere))
.Add(Expression.Like(OrderId2.ToString(), string.Concat("%", Projections.Property<Order>(a => a.OrderId1), "%")));
您可能还需要在其中添加And(虽然我不需要)。