NHibernate逆转Restrictions.Like参数

时间:2012-08-07 22:38:21

标签: c# nhibernate criteria-api

在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限制不允许将投影属性作为第二个参数,这就是为什么我不知道如何“反转”之类的原因。

1 个答案:

答案 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(虽然我不需要)。