linq(对于nHibernate):'喜欢'运算符

时间:2011-03-30 13:36:33

标签: linq nhibernate linq-to-nhibernate

您好
给定一个字符串列表,我想要检索名称中包含给定字符串之一的所有项目 例如给定{“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上试过这个......)

3 个答案:

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