我正在尝试在活动记录中进行伪模糊逻辑查询。
我该如何表达:
field1 像'A' 或 field2 像'A' 或 field3 像'A' 或 field1 像'B' 或 field2 像'B' 或 field3 像'B'
使用 ICriteria 对象......“喜欢”需要是 InsensitiveLikeExpressions 吗?
我正在尝试在活动记录中进行伪模糊逻辑查询。
我该如何表达:
field1 像'A' 或 field2 像'A' 或 field3 像'A' 或 field1 像'B' 或 field2 像'B' 或 field3 像'B'
使用 ICriteria 对象......“喜欢”需要是 InsensitiveLikeExpressions 吗?
这个怎么样:
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。
它不是 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 的参数。
(为答案投票将不胜感激)