簡體   English   中英

linq(至nHibernate):“喜歡輸入”運算符

[英]linq (to nHibernate): 'like in' operator

你好
給定一個字符串列表,我想檢索名稱包含給定字符串之一的所有項。
例如,給定{“ foo”,“ kuku”},我想檢索員工“ Corfoo”,“ kuku maluku”和“ kukufoo”。
我嘗試了以下操作,但是有一個空引用異常(?)

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

以下產生了“ Lambda表達式不在范圍內”異常。

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

任何想法如何做到這一點?
我一直在考慮遍歷值集合並為每個元素添加新條件的思路。
問題是-.Where()函數是一個連詞(AND),我需要析取(OR)...
(我在Linq provider上使用nH 2.1.2;尚未在nH3.0上嘗試過此方法...)

如果您不僅限於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,它可以擺脫魔術字符串。

我使用以下代碼希望對您有所幫助;

  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; } 

我使用了以下編碼樣式

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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM