2011-03-30 61 views
2


給定一個字符串列表我想檢索其名稱包含給定字符串之一的所有項目。
舉例 - 給定{「foo」,「kuku」}我想檢索員工「Corfoo」,「kuku maluku」和「kukufoo」。
我試過以下,但有一個空引用異常(?)linq(到nHibernate):'like in'運算符

query.Where(u => values.Any(v=> u.FullName.Contains(v))); 

下面產生「Lambda表達式不在範圍內」的異常。

query.Where(u => (values.Count(v => u.FullName.Contains(v)) > 0)); 

任何想法,這可怎麼辦呢?
我正在考慮迭代值集合併爲每個元素添加新條件。 ()函數是一個連接點(AND),我需要分離(或)...
(我使用nH 2.1.2與Linq提供程序;沒有嘗試過這個nH3。 0尚未...)

回答

3

如果不侷限於LINQ提供程序,但也開到的ICriteria API,我建議使用下列內容:

List<string> fullnames = new List<string>() { "foo", "kuku" }; 
// prepare Query 
var query = session.CreateCriteria(typeof(Employee)); 
// dynamically add Like-conditions combined with OR 
Disjunction namesCriteria = Restrictions.Disjunction(); 
foreach (var name in fullnames) 
{ 
    namesCriteria.Add(Restrictions.Like("FullName", name, MatchMode.Anywhere)); 
} 
// add complete Disjunction to prepared query 
query.Add(namesCriteria); 
IList<Employee> list = query.List<Employee>(); 

我認爲試圖在NHibernate.Linq可能如果不是不可能,就更難。使用NH 3.0,您可以使用QueryOver,它可以擺脫魔術字符串。

+0

我一直希望使用Linq,但在我看來,這似乎是不可能的...... – 2011-03-31 07:42:59

1

我用下面的代碼希望它有幫助;

public IList<AutoCompleteDto> GetCitiesLike(string text) 
    { 
     AutoCompleteDto autoCompleteDto = null; 

     var cityList = UnitOfWork.CurrentSession.QueryOver<City>() 
      .Where(x => x.CityName.IsLike(text, MatchMode.Start)) 
      .SelectList(u => u 
           .Select(x => x.Id).WithAlias(() => autoCompleteDto.Id) 
           .Select(x => x.CityName).WithAlias(() => autoCompleteDto.Name) 
           .Select(x => x.CityName).WithAlias(() => autoCompleteDto.Value)) 
      .TransformUsing(Transformers.AliasToBean<AutoCompleteDto>()) 
      .List<AutoCompleteDto>(); 


     return cityList; 
    } 
1

我用下面的編碼樣式

QueryOver

IQueryOver<Patient> rowCount = Session.QueryOver<Patient>().ToRowCountQuery(); 

        IQueryOver<Patient> result = this.Session.QueryOver<Patient>() 
        .Where(p => (p.FullNameEn.IsLike("%" + criteria.Keyword.Replace(" ", "%") + "%")) 
         || (p.FullNameAr.IsLike("%" + criteria.Keyword.Replace(" ", "%") + "%")) 
         || (p.IdentityNO == criteria.Keyword) 
         || (p.MobileNO == criteria.Keyword) 
         || (p.PatientID == patientIDKeyword) 
        ) 
         .OrderBy(p => p.FullNameEn).Asc 
         .Take(criteria.PageSize) 
         .Skip((criteria.Page - 1) * criteria.PageSize); 


        totalCount = result.ToRowCountQuery().FutureValue<int>().Value; 
        transaction.Commit(); 
        return result.Future<Patient>().ToList(); 

LINQ

var query = this.LINQ; 
query = query.Where(p => p.VendorNameAr.Contains(criteria.Keyword.Replace(" ", "%")) || 
              p.VendorNameEN.Contains(criteria.Keyword.Replace(" ", "%"))); 
return query.ToList();