搜索我的网站,而不必嵌套多个IFS

时间:2011-01-04 16:44:48

标签: .net sql database vb.net linq

我想在我的数据库中搜索表格中的产品(产品) 问题是我不想要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,搜索将是所有的countys / categorys /标题....是否有更好的方法来做到这一点?我的意思是linq很棒,必须有一种方法让它更有活力所以我不需要IFS。

4 个答案:

答案 0 :(得分:3)

您可以将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 :(得分:1)

不是嵌套if,而是反转它们和return

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

注意条件突然变得积极。

[编辑]
将600行拆分为较小的函数,其中每个函数只进行一次搜索。如果在这种情况下搜索没有意义,请使用上面的代码尽早保留它们。然后使用新的“main”函数来调用它们,直到其中一个返回结果(或类似)。在OO语言中,我创建“工人”,每个人都运行,直到其中一个人告诉我“我得到了它”。

答案 2 :(得分:1)

我不确定我是否完全理解你的问题 - 你想在非零时搜索一个值,但是当它为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)

答案 3 :(得分:0)

我不知道VB,但您是否可以提交所需搜索项列表并创建动态数据库查询?