сделать поиск по моему сайту без необходимости размещать несколько IFS - PullRequest
3 голосов
/ 04 января 2011

Я хотел бы найти в моей базе данных продукты из таблицы (продукты) Проблема в том, что я не хочу 600 строк кода с несколькими if. Код выглядит следующим образом (не хочу так)

Public Function GetSearchResults(ByVal County As Integer, Optional ByVal Searchtext As String = "", Optional ByVal Category As Integer = 0, Optional ByVal SubCategory As Integer = 0) As List(Of Product)
    Dim dc As New DataClassesDataContext
    Dim Listholder As New List(Of Product)

    If Searchtext IsNot "" Then
        If County > 0 Then
            If Category > 0 Then
                If SubCategory = 0 Then
                        Dim Results = From p In dc.Products _
                        Where p.Headline.Contains(Searchtext) _
                        Where p.CategoryID = Category _
                        Where p.CountyID = County _
                        Select p

                        Listholder = Results.ToList
                        Return Listholder.ToList

И много других, и так далее ... Проблема в том, что если значение равно 0 для любого из вышеперечисленных, поиск будет для всех стран / категорий / заголовков .... есть ли лучший способ сделать это ? я имею в виду linq - это здорово, должен быть способ сделать его более динамичным, поэтому мне не нужен IFS.

Ответы [ 4 ]

3 голосов
/ 05 января 2011

Вы можете просто связать свои фильтры Where.

public static void Search(String headline = null, Int32 county = 0, Int32 category = 0, Int32 subCategory = 0) {
    var dc = new DataClassesDataContext();
    var result = dc.Products;

    if (headline != null)
        result = result.Where(p => p.Headline.Contains(headline));

    if (county != 0)
        result = result.Where(p => p.CountyId == county);

    if (category != 0)
        result = result.Where(p => p.CategoryId == category);

    if (subCategory != 0)
        result = result.Where(p => p.SubCategoryId == subCategory);

    var listHolder = result.ToList();
    // ...
}
1 голос
/ 04 января 2011

Не уверен, что я полностью понимаю ваш вопрос - вы хотите найти значение, если оно не равно нулю, но вернуть все строки, когда оно равно 0?Вы можете свернуть это сравнение в Where's

Where (CategoryID > 0 AND p.CategoryID = Category) OR (CategoryID = 0) _ 
Where (CountyID > 0 AND p.CountyID = CountyID) OR (CountyID = 0) _ 
Where (SubCategoryID > 0 AND p.SubCategoryID = SubCategoryID) or (SubCategoryID = 0)
1 голос
/ 04 января 2011

Вместо вложения if с инвертируйте их и return:

if value is "" then Exit Function
if County <= 0 then Exit Function

Обратите внимание, что состояние тоже внезапно становится положительным.

[EDIT]
Разделите 600 строк на более мелкие функции, где каждая из них выполняет только один поиск. Используйте код выше, чтобы оставить их раньше, если поиск не имеет смысла в этом случае. Затем используйте новую функцию «main», чтобы вызывать их, пока один из них не вернет результат (или аналогичный). На языке ОО я бы создавал «рабочих», запускал каждого до тех пор, пока один из них не сказал мне: «Я понял».

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

Я не знаю VB, но не могли бы вы представить список необходимых элементов поиска и создать динамический запрос к базе данных?

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