0

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

4

1 回答 1

0

您可以使用 chain 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(尽管我不需要)。

于 2012-08-07T23:26:24.040 回答