Как этот запрос перевести в динамическое выражение Linq? - PullRequest
0 голосов
/ 24 января 2012
select *
    from bis.CompanyInfo ci
    where ci.IsDeleted = 0
        and ci.IsBindingApproved = 1
        and ((ci.[Name] like N'%blah%'
            or ci.CityName like N'%blah%')
            or (ci.[Name] like N'%groupe%'
                or ci.CityName like N'%groupe%'))

Учтите, что "бла" и "группа" - это ключевые слова, которые я должен искать. Количество ключевых слов для поиска является переменным, поэтому оно должно быть динамическим. Таким образом, у меня может быть любое количество ключевых слов для поиска от 0 до сотен.

Любая помощь приветствуется! =)

Ответы [ 2 ]

1 голос
/ 24 января 2012
var result = (from oCompanyInfo as CompanyInfo in CompanyInfoList
             where oCompanyInfo.IsDeleted = 0 and oCompanyInfo.IsBindingApproved = 1 and             
             (Name.Contains("blah") or oCompanyInfo.CityName.Contains("blah") or
             oCompany.Name.Contains("groupe") or oCompany.CityName.Contains("groupe"))
             select oCompanyInfo).ToList()

Там вы можете заменить «blah» или «groupe» на txtCompanyName.Text и txtCityName.text (если текст фильтра находится в текстовом поле)

0 голосов
/ 24 января 2012

Кажется, что есть порядок или тому подобное, чтобы присоединиться к внутреннему фильтру.Давайте возьмем этот код как исходный из моего CreateFilter метода.

private Expression<Func<CompanyInfo, bool>> 
    CreateFilter(SearchCriterion criterion) {
    var outerFilter = PredicateBuilder.True<CompanyInfo>();
    outerFilter = outerFilter.And(ci => !ci.IsDeleted && ci.IsBindingApproved);

    var innerFilter = PredicateBuilder.False<CompanyInfo>();
    foreach(var keyword in criterion.Keywords) {
        var w = keyword;
        innerFilter = innerFilter.Or(ci => ci.Name.Contains(w)
                                        || ci.CityName.Contains(w))
    }
    outerFilter = outerFilter.And(innerFilter);

    if (criterion.HasCityName)
        outerFilter = outerFilter.And(ci => 
            ci.CityName.Contains(criterion.CityName));

    // Other similar filter here...

    return outerFilter;
}

Это не вернуло правильные результаты.Затем, в соответствии с этой статьей: LINQ: сложный расширенный поиск с пунктом «Динамическое где» , я изменил свой код.

private Expression<Func<CompanyInfo, bool>> 
    CreateFilter(SearchCriterion criterion) {
    var innerFilter = PredicateBuilder.False<CompanyInfo>();
    foreach(var keyword in criterion.Keywords) {
        var w = keyword;
        innerFilter = innerFilter.Or(ci => ci.Name.Contains(w)
                                        || ci.CityName.Contains(w))
    }
    var outerFilter = PredicateBuilder.True<CompanyInfo>();
    outerFilter = outerFilter.And(ci => !ci.IsDeleted && ci.IsBindingApproved);

    if (criterion.HasCityName)
        outerFilter = outerFilter.And(ci => 
            ci.CityName.Contains(criterion.CityName));

    // Other similar filter here...

    // Here, we want to include the filter on keywords only when there are 
    // some provided with the search.
    // Otherwise, the result of the And(innerFilter) with no keywords
    // will always be 'false' and return no results though other criterion
    // might be met such as the CityName and whatever the others are.
    if (criterion.HasKeywords) outerFilter = outerFilter.And(innerFilter);

    return outerFilter;
}

И он работает безупречно!Я не очень понимаю, почему результаты идеальны только потому, что порядок фильтров влияет на результаты, и это сработало для меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...