我对活动记录中的伪模糊逻辑查询进行了分析。
我如何表达:
field1喜欢'A'或field2喜欢'A'或 field3喜欢'A'或field1喜欢'B'或 field2喜欢'B'或field3喜欢'B'
使用ICriteria对象...'喜欢'需要不敏感的表达式?
答案 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的参数。
(赞赏答案将不胜感激)