Большое ИЛИ выражение в Castle.ActiveRecord - PullRequest
2 голосов
/ 27 февраля 2009

Я склонен к выполнению псевдо-нечеткого логического запроса в активной записи.

Как мне выразить:

field1 как 'A' или field2 как 'A' или field3 как 'A' или field1 как 'B' или field2 как 'B' или field3 как 'B'

с использованием объектов ICriteria ... где «лайки» должны быть InsensitiveLikeExpressions?

Ответы [ 2 ]

2 голосов
/ 28 февраля 2009

Как насчет этого:

    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 по мере необходимости.

0 голосов
/ 27 февраля 2009

Это не объекты 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.

(голосование за ответ приветствуется)

...