【问题标题】:How to get Lambda in LINQ to actually filter for dynamic linq如何在 LINQ 中获取 Lambda 以实际过滤动态 linq
【发布时间】:2009-09-10 16:40:14
【问题描述】:

例子-我有一个person类

Public Class Person
Private _fname As String
Public Property Fname() As String
    Get
        Return _fname
    End Get
    Set(ByVal value As String)
        _fname = value
    End Set
End Property
Private _lname As String
Public Property Lname() As String
    Get
        Return _lname
    End Get
    Set(ByVal value As String)
        _lname = value
    End Set
End Property
Private _age As Integer
Public Property Age() As Integer
    Get
        Return _age
    End Get
    Set(ByVal value As Integer)
        _age = value
    End Set
End Property

结束类

  Dim people As New List(Of Person)
    people.Add(New Person With {.Fname = "Alice", .Lname = "Apples", .Age = 1})
    people.Add(New Person With {.Fname = "Bob", .Lname = "Banana", .Age = 2})
    people.Add(New Person With {.Fname = "Charlie", .Lname = "Cherry", .Age = 3})
    people.Add(New Person With {.Fname = "Dave", .Lname = "Durian", .Age = 4})
    people.Add(New Person With {.Fname = "Eric", .Lname = "EggPlant", .Age = 10})

    Dim filteredPerson = From person In people
    filteredPerson.Where(Function(fp) fp.Fname = "Bob")

    Dim finalList = filteredPerson.ToList
    For Each p In finalList
        Debug.Print("FNAME: " + p.Fname)
    Next

这仍然返回所有 5 个人,比如 where 没有被应用,我做错了什么?

我还希望能够传递名称列表并仅返回这些名称

  Dim searchList As New List(Of String)
    searchList.Add("Bob")
    searchList.Add("Dave")

    Dim filteredPerson = From person In people
    For Each s In searchList
        Dim innerName As String = s
        filteredPerson.Where(Function(fp) fp.Fname = innerName)
    Next
    Dim finalList = filteredPerson.ToList
    For Each p In finalList
        Debug.Print("FNAME: " + p.Fname)
    Next

【问题讨论】:

    标签: vb.net linq-to-objects dynamic-linq


    【解决方案1】:

    问题在于 Where 没有改变 集合。它返回新过滤的集合。

    试试这个:

     Dim filteredPerson = people.Where(Function(fp) fp.Fname = "Bob")
    

    (顺便说一句,我在这里看不到任何动态...您在哪里使用动态 LINQ?)

    要添加多个 Where 子句,您需要这样的内容:

    Dim searchList As New List(Of String)
    searchList.Add("Bob")
    searchList.Add("Dave")
    
    Dim filteredPerson As IEnumerable(Of String) = people
    For Each s In searchList
        Dim innerName As String = s
        filteredPerson = filteredPerson.Where(Function(fp) fp.Fname = innerName)
    Next
    Dim finalList = filteredPerson.ToList
    For Each p In finalList
        Debug.Print("FNAME: " + p.Fname)
    Next
    

    但是,我不认为这实际上是您想要做的。每个Where 子句都将坚持Fname 是指定的名称——它不会同时是Bob Dave!我认为您实际上想要一些可以更简单地表达的东西:

    Dim searchList As New List(Of String)
    searchList.Add("Bob")
    searchList.Add("Dave")
    
    Dim filteredPerson = people.Where(Function(fp) searchList.Contains(fp.Fname))
    Dim finalList = filteredPerson.ToList
    For Each p In finalList
        Debug.Print("FNAME: " + p.Fname)
    Next
    

    我们只想知道Fname 是否在searchList 中,这是Contains 所做的。

    【讨论】:

    • 它在最后一个代码部分,我希望能够传入一个名称列表,为每个名称添加 where 子句,在该示例中,我希望一个列表(人员)与 2项目鲍勃和戴夫
    • 就是这样!这正是我想要表达的。谢谢
    • @Jon:我不知道语法。你能举一个用 JOIN 代替的第二种情况的例子吗?
    • @shahkalpesh:恐怕我不明白你的意思。第二种情况,为什么要加入?
    • +1 表示包含。人们真的很挣扎。我相信这是因为您正在对第二个数据集进行操作并使用第一个元素作为参数,而程序方法是考虑“对于我的搜索列表中的每个元素”......
    【解决方案2】:
    Dim people As New List(Of Person)
    people.Add(New Person With {.Fname = "Alice", .Lname = "Apples", .Age = 1})
    people.Add(New Person With {.Fname = "Bob", .Lname = "Banana", .Age = 2})
    people.Add(New Person With {.Fname = "Charlie", .Lname = "Cherry", .Age = 3})
    people.Add(New Person With {.Fname = "Dave", .Lname = "Durian", .Age = 4})
    people.Add(New Person With {.Fname = "Eric", .Lname = "EggPlant", .Age = 10}) 
    
    Dim searchList As New List(Of String)
    searchList.Add("Bob")
    searchList.Add("Dave")
    
    dim filteredItems = from p in people _
    join i in searchList on p.FName equals i _
    select p
    
    dim personFound as Person
    
    for each personFound in filteredItems
        Console.WriteLine(personFound.Lname)
    next
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多