Castle.ActiveRecord中的大OR表达式

时间:2009-02-27 01:51:00

标签: .net castle-activerecord

我对活动记录中的伪模糊逻辑查询进行了分析。

我如何表达:

  

field1喜欢'A'或field2喜欢'A'或   field3喜欢'A'或field1喜欢'B'或   field2喜欢'B'或field3喜欢'B'

使用ICriteria对象...'喜欢'需要不敏感的表达式?

2 个答案:

答案 0 :(得分:2)

这个怎么样:

    public T[] FuzzyFind<T>(string[] fields, string[] values) where T: class {
        var dis = new Disjunction();
        foreach (var f in fields)
            foreach (var v in values)
                dis.Add(new InsensitiveLikeExpression(f, v, MatchMode.Anywhere));
        return ActiveRecordMediator<T>.FindAll(dis);
    }

然后你这样称呼它:

var locations = FuzzyFind<ARAddressableLocation>(new[] { "field1", "field2", "field3 }, new[] { "a", "b" });

产生(字段,值)

的所有组合

根据需要调整MatchMode。

答案 1 :(得分:0)

它不是ICriteria对象,但在HQL中答案是:

string hql = "FROM ARAddressableLocation as al WHERE (LOWER(al.SubNumber) = '{0}' OR LOWER(al.Number) = '{0}' OR...";
ARAddressableLocation[] obj = (ARAddressableLocation[])Execute(
    delegate(ISession session, object instance) {
      IQuery query = session.CreateQuery(hql);
      IList results = query.List();

      ARAddressableLocation[] list = new ARAddressableLocation[results.Count];
      results.CopyTo(list, 0);

      return list;
    }, null);

我的字段都是字符串,所以我选择将它们放在我自己而不是使用NHibernate的参数。

(赞赏答案将不胜感激)