2011-01-18 2 views
1

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

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

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

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); 

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

ответ

0

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

Если да, то почему не просто (c.CountryID < ids.Count)?

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

+0

Потому что цифры не обязательно последовательны. Например, возвращаемые идентификаторы могут быть идентификаторами 0 и 17, что означает, что это должно быть c => c.CountryID == 0 || c.CountryID == 17 У меня также есть что-то отдельное для обработки одного ID. Решение, которое я ищу здесь, для нескольких. – Wraiyth

+0

Хорошо, я неправильно прочитал ваш пост, когда вы сказали, что это зависит от размера списка. Вы хотите отфильтровать, где c.CountryID найден в одной из стран, возвращенных в идентификаторы? – Rob

+0

Да, точно.Таким образом, список может содержать значения 0, 1, 5, 10, и мне нужны * все * те, которые включены в мой оператор. И насколько мне далеко, все они должны быть в отдельном предикате, я не могу добавить один для каждого ID (по крайней мере, я его пробовал, и он не работал) – Wraiyth

1

Это полная реализация метода 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

Это правда, если только автор хочет сначала загрузить все страны с их именами с сервера. Но это не упоминается автором, я полагаю. ;) –

+0

Он уже загружается из базы данных с помощью .ToList() – Rob

+0

Мне нужны результаты моего первоначального запроса, чтобы перейти в другой, поэтому я не вижу, как это подходит? – Wraiyth

0

Почему вы создаете 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 имеет хорошее качество, поэтому вы не можете создавать несколько запросов.

Смежные вопросы