我想在我的数据库中搜索表格中的产品(产品) 问题是我不想要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。
答案 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,但您是否可以提交所需搜索项列表并创建动态数据库查询?