Linq 林克(对nHibernate):&x27;就像在';操作人员

Linq 林克(对nHibernate):&x27;就像在';操作人员,linq,nhibernate,linq-to-nhibernate,Linq,Nhibernate,Linq To Nhibernate,你好 给定一个字符串列表,我想检索其名称包含给定字符串之一的所有项目。 例如,给定{“foo”,“kuku”}我想检索员工“Corfoo”,“kuku maluku”和“kukufoo”。 我尝试了以下操作,但得到了空引用异常(?) 以下操作产生了“Lambda表达式不在范围内”异常 query.Where(u => (values.Count(v => u.FullName.Contains(v)) > 0) ); 你知道怎么做吗? 我一直在考虑迭代values集合,并为每

你好
给定一个字符串列表,我想检索其名称包含给定字符串之一的所有项目。
例如,给定{“foo”,“kuku”}我想检索员工“Corfoo”,“kuku maluku”和“kukufoo”。
我尝试了以下操作,但得到了空引用异常(?)

以下操作产生了“Lambda表达式不在范围内”异常

query.Where(u => (values.Count(v => u.FullName.Contains(v)) > 0) );
你知道怎么做吗?
我一直在考虑迭代values集合,并为每个元素添加一个新条件。
问题是,.Where()函数是一个连词(AND),我需要析取(OR).

(我正在将NH2.1.2与Linq provider一起使用;还没有在nH3.0上尝试过……

如果您不仅限于Linq provider,而且还开放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>();
List fullnames=newlist(){“foo”,“kuku”};
//准备查询
var query=session.CreateCriteria(typeof(Employee));
//动态添加与或组合的相似条件
析取名称Criteria=限制。析取();
foreach(全名中的变量名)
{
namesCriteria.Add(Restrictions.Like(“FullName”、name、MatchMode.Anywhere));
}
//将完全析取添加到准备好的查询
查询.添加(命名条件);
IList list=query.list();

我想在NHibernate尝试一下。Linq可能会更难,如果不是不可能的话。在NH3.0中,您可以使用QueryOver,这将消除神奇的字符串。

我使用了以下代码,希望对您有所帮助

public IList GetCitiesLike(字符串文本)
{
AutoCompleteDto AutoCompleteDto=null;
var cityList=UnitOfWork.CurrentSession.QueryOver()
.Where(x=>x.CityName.IsLike(text,MatchMode.Start))
.选择列表(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())
.List();
返回城市列表;
}

我使用了以下编码风格

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来实现这一点,但在我看来,这似乎也是不可能的。。。
   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;
    }
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();
var query = this.LINQ;
query = query.Where(p => p.VendorNameAr.Contains(criteria.Keyword.Replace(" ", "%")) ||
                                             p.VendorNameEN.Contains(criteria.Keyword.Replace(" ", "%")));
return query.ToList();