您好
给定一个字符串列表,我想要检索名称中包含给定字符串之一的所有项目
例如给定{“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)...
(我正在使用nH 2.1.2和Linq提供商;还没有在nH3.0上试过这个......)
答案 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,它可以摆脱神奇的字符串。
答案 1 :(得分: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; }
答案 2 :(得分:1)
我使用了以下编码样式
<强> QueryOver 强>
<asp:TemplateField HeaderText="Info Page">
<ItemTemplate>
<asp:DropDownList ID="ddlInfo" runat="server" DataSourceID="YourDataSourceID" DataTextField="ColumnName"></asp:DropDownList>
</ItemTemplate>
</asp:TemplateField>
<强> LINQ 强>
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();