2014-01-29 83 views
2

我有哪些搜索使用三個參數的搜索代碼,但我想通過一個單一的參數,並與所有三個或四個或任意數量的在code.Can變量匹配它的任何一個給我前進的道路搜索通過NHibernate的

ICriteria oCriteria = base.Session.CreateCriteria<Patient>("p").CreateCriteria("User", "u", NHibernate.SqlCommand.JoinType.InnerJoin) 
         .Add(Restrictions.Eq("u.IsDeleted", false)).Add(Restrictions.Eq("u.IsPatientSignUp", false)).Add(Restrictions.Like("u.FirstName", '%' + data + "%")) 

         .Add(Restrictions.Like("u.LastName", '%' + data + "%")).Add(Restrictions.Like("u.Email", '%' + data + "%")) 
         .Add(Restrictions.Or(cr1, cr2)) 
         .AddOrder(Order.Asc(Projections.Cast(NHibernateUtil.Int32, Projections.Property("p.MedNexusId")))); 
         patient = oCriteria.List<Patient>().Skip(pageNumber * pageSize).Take(pageSize).ToList(); 
+0

BTW使用'+數據+'正在開啓您對SQL注入 – Rippo

+0

數據是字符串類型的參數前面我有名字,姓氏,電子郵件等不同的變量,但現在我有一個單一的文本框爲所有的值,這是數據 –

回答

2

NHibernate的爲我們提供了一組基本工具(在這種情況下限制),我們可以擴展他們(創建新ICriterion或將它們結合起來。因此,我們可以創建一個通用的方法像這樣:

// multiple AND 
public static AbstractCriterion AllLike(IEnumerable<string> properties, string toCompare) 
{ 
    Conjunction conjunction = Restrictions.Conjunction(); 
    foreach (var name in properties) 
    { 
     conjunction.Add(Restrictions.Like(name, toCompare, MatchMode.Anywhere)); 
    } 
    return conjunction; 
} 
// multiple OR 
public static AbstractCriterion AnyLike(IEnumerable<string> properties, string toCompare) 
{ 
    Disjunction disjunction = Restrictions.Disjunction(); 
    foreach (var name in properties) 
    { 
     disjunction.Add(Restrictions.Like(name, toCompare, MatchMode.Anywhere)); 
    } 
    return disjunction; 
} 

現在我們可以那樣稱呼他們:

ICriteria oCriteria = .... 
var toMatch = new[] {"u.LastName", "u.Email", ...}; 
criteria.Add(AllLike(toMatch, data)); 
// or 
criteria.Add(AnyLike(toMatch, data)); 

注:類似的實現已經存在Restrictions.AllEq(IDictionary propertyNameValues)