Количество ор на основе списка - PullRequest
1 голос
/ 18 января 2011

Я работаю над тем, что запрашивает базу данных в зависимости от значений, введенных пользователем. Например, пользователь может искать страну (возможно, «Au»), и будут возвращены любые страны, содержащие «Au».

Проблема заключается в том, что мне нужно иметь возможность добавить несколько операторов «или» в предикат для достижения этого результата, но не знаю, как это сделать.

Прямо сейчас у меня есть

List<int> ids;
ids = (from d in DTDC.Countries
       where d.Name.ToLower().Contains( country.ToLower() )
       select d.CountryID).ToList();

var SearchPredicate = PredicateBuilder.True<DLC>();

// Example
searchPredicate = searchPredicate.And(c => c.CountryID == 0 || c.CountryID == 1 );

Так что мне нужно сгенерировать

searchPredicate = searchPredicate.And(c => c.CountryID == 0 || c.CountryID == 1 );

это утверждение в зависимости от значений в списке, который возвращается из моего запроса LINQ.

Например, если список имеет значения 0, 1, 7, тогда запрос должен быть

searchPredicate = searchPredicate.And(c => c.CountryID == 0 || c.CountryID == 1 || || c.CountryID == 7 );

Надеюсь, этого достаточно, чтобы кто-то понял, что я пытаюсь сделать:)

Ответы [ 3 ]

1 голос
/ 18 января 2011

Это полная реализация метода In. Вы можете выбрать несколько из них.

public static class Ext
{
    public static bool In<T>(this T val, params T[] values)
    {
        return val.In(EqualityComparer<T>.Default, values);
    }

    public static bool In<T>(this T val, EqualityComparer<T> comparer, params T[] values)
    {
        foreach (var v in values)
        {
            if (comparer.Equals(val, v)) return true;
        }
        return false;
    }

    public static bool In<T>(this T val, Func<T, T, bool> comparer, params T[] values)
    {
        foreach (var v in values)
        {
            if (comparer(v, val)) return true;
        }
        return false;
    }
}

Использование:

int num = 1;
bool exist = num.In(2, 3, 4, 5);
0 голосов
/ 18 января 2011

Почему вы создаете List, если хотите фильтровать больше? Вместо этого верните IQueryable, и тогда вы можете применить больше фильтров к этому ... как это например:

public IQueryable<Country> GetAllCountries()
{
    return from d in DTDC.Countries select d;
}

Тогда вы можете иметь методы расширения для IQueryable<Country>, такие как:

public static class CountryFilters
{
    public static IQueryable<Country> ThatContainsName(this IQueryable<Country> query, string country)
    {
        return query.Where(y => y.Name.ToLower().Contains(country.ToLower()));
    }
}

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

Кроме того, при применении этих фильтров я бы проверял, что сгенерированный sql хорошего качества, чтобы вы не заканчивали многократными запросами.

0 голосов
/ 18 января 2011

Не совсем уверен, что вы пытаетесь сделать здесь .. Если список содержит 3 элемента, вы хотите сгенерировать c => c.CountryID == 0 || c.CountryID == 1 || c.CountryID == 2?

Если так, то почему бы просто (c.CountryID

Кроме того, если вы выполняете запрос, который возвращает только 1 страну, вы уверены, что хотите отфильтровать его по countryID == 0?

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