2017-04-11 72 views
1

我有两个按过滤器顺序不同的LINQ查询。我想避免使用嵌套的If语句。如何使用LINQ过滤对象列表而不使用嵌套If语句

我目前的aproach是:

If (userlist.count > 0) Then 
    If (Filter()) Then 
     users = From u In userlist Order By (If(u.name) username,1,0) 
       descending u.name ascending 
    Else 
     users = From u In userlist 
       Select u.name Distinct Order By u.name Ascending 
    End If 
Else 
    users = New List(Of String) 
End If 
+1

使用三元运算符?它看起来很乱,但是...也许创建一个函数来处理Linq查询。这将是相当整洁。 –

+1

你的代码有一堆我可以告诉的错误 - If(没有3个参数,If()之后的神秘用户名引用,第二个From中的Order By之前的选择,用户的不同数据类型那么和其他部分的嵌套if? – NetMage

回答

0

如果我理解正确你只是想避免嵌套if语句。 您可以通过使用函数并在条件有效时立即使用Return函数来实现此目的。

Function GetUserNames(userList As List(Of UserList), username As String) 
    If (userList Is Nothing OrElse Not userList.Any()) Then 
     Return New List(Of String) 
    End If 

    If Filter() Then 
     Return From u In userList Order By (If(u.Name = username, 1, 0)) Descending, u.Name Ascending 
    End If 

    Return From u In userList 
      Select u.Name Distinct 
      Order By Name Descending 
End Function 

注意,您没有嵌套的if语句,实际上您也不需要else部分。

同时利用linq构建语句。假设独立的名称应适用于这两个查询:

Dim query = userList.Select(Function(u) u.Name).Distinct 

    If Filter() Then 
     Return query.OrderByDescending(Function(n) If(n = username, 1, 0)).ThenBy(Function(n) n) 
    End If 

    Return query.OrderBy(Function(n) n) 

- 更新 -

赏金询问“..答案来自可信的和/或官方渠道画画。”。这就是为什么我已经包括马丁·福勒,的文章的链接,其中是这样描述的设计:

https://www.refactoring.com/catalog/replaceNestedConditionalWithGuardClauses.html

0

我更喜欢使用Select Case语句在我的LINQ查询的SortOrderBy一部分,因为它更容易阅读:

Select Case search.Sort 
    Case "Name" 
     OutputList = OutputList.OrderBy(Function(x) x.Name).ToList() 

    Case "-Name" 
     OutputList = OutputList.OrderByDescending(Function(x) x.Name).ToList() 

    Case "Date" 
     OutputList = OutputList.OrderBy(Function(x) x.[Date]).ToList() 

    Case "-Date" 
     OutputList = OutputList.OrderByDescending(Function(x) x.[Date]).ToList() 

    Case "Percent" 
     OutputList = OutputList.OrderBy(Function(x) x.CompletedPercentage).ToList() 

    Case "-Percent" 
     OutputList = OutputList.OrderByDescending(Function(x) x.CompletedPercentage).ToList() 

End Select 
0

假设我正确地解释你的代码,为什么不去掉所有的if语句?

Dim sortUsername = If(Filter(), "", username) 
    users = (From u In userlist Order By If(u.name > sortUsername, 1, 0) Descending, u.name Ascending Select u.name Distinct).ToList 
0

您可以在LINQ中使用let关键字,并有一个变量用于决策。