2011-12-21 3 views
0
List<LICENSE> licenseList = context.LICENSE.Where(l => (string.IsNullOrEmpty(licenseID) || l.LICENSE_ID.Contains(licenseID)) && (string.IsNullOrEmpty(hardwareID) || l.HARDWARE_ID.Contains(hardwareID))).Take(10).ToList(); 

Это мое текущее решение для обработки нескольких поисковых запросов. Его функция поиска, которая объединяет 2 или более текстовых полей в поиске. Поэтому мои вопросы: это хороший способ отфильтровать прошедшие поисковые строки. И как я использую его, когда запросы представляют собой десятичные числа вместо строк? СпасибоC# поиск фильтра, несколько поисковых запросов

ответ

0

Ваш пример отлично.

Что касается него являются десятичные:

  1. Если это обнуляемым типа, то вы должны сначала проверить, если это имеет значение, и если он имеет, что это не значение по умолчанию для decimal, который равен 0.

  2. Если это не тип с нулевым значением, то все, что вам нужно сделать, это проверить, что это/is not == to 0, который является типом по умолчанию. Я всегда проверяю, чтобы он был больше нуля, исходя из предположения, что лицензия не будет отрицательной.

Я буду считать, что это не обнуляемым типа, как это, кажется, рядный объявлен вар, поэтому здесь отформатированный пример десятичной:

List<LICENSE> licenseList = 
    context.LICENSE.Where(l => licenseID == 0 || l.LICENSE_ID.Contains(licenseID)) 
        .Where(l => hardwareID == 0 || l.HARDWARE_ID.Contains(hardwareID)) 
        .Take(10) 
        .ToList(); 

Интересно отметить, если вы не знаете, по умолчанию тип поля, вы всегда можете сделать

licenseID == default(decimal) 
+0

Я полагаю, что все ваши ответы верны, но я не согласен с этим. Спасибо за помощь, ребята, хотя я, очевидно, почти решил это сам :) – Johan

0

Вы можете попробовать использовать цикл foreach в окнах поиска, модифицируя linq для любого из них.

 object[] a = {"seach", 5};     // "Data" 
     string[] Search = { "asdf", "asdf" };    //Search boxes 
     var s = a.Where(l => ((string)l).Contains(Search[0]));  //first search 
     for (int i = 1; i < Search.Length; i++)    //consecutive searches 
      s = s.Where(l => ((string)l).Contains(Search[i])); 
0

Да, это нормально. Кроме того, можно использовать цикл как-то так:

var query = context.LICENSE; 
foreach(var item in stringVariables) { 
    query = query.Where(x => string.IsNullOrEmpty(item) || l.LICENSE_ID.Contains(item)); 
} 

и stringVariables могут быть предопределены или некоторый алгоритм, чтобы решить, является ли это поле поиска или нет.

Относительно чисел (и если ваш столбец имеет тип int, если это string, вам ничего не нужно менять), вы, вероятно, имеете число с нулевым числом, в зависимости от формы поиска. Таким образом, вы также должны проверить, является ли оно нулевым или нет, и является ли это правильным числом. Вы можете отправить его в строку, чтобы иметь функцию Contains. Но все зависит от вашего приложения.

+0

Вам не нужно бросать в строку для Содержит ... –

+0

@ TBohnen.jnr: Что ты имеешь в виду, я не нужно лить в строку? Мой тип 'int' не имеет функции Содержит. Как реализовать функциональность 'Contains' с помощью ints? – duedl0r

+0

вам нужна ссылка на System.Linq; Compare использует System.Collections.Generic.IEqualityComparer , что означает любой тип списка, который он будет сравнивать, учитывая, что вы предоставляете его того же типа, что и список, а не только строки. –

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