2009-09-10 60 views
0

例子,我有一个个人类如何获得LAMBDA在LINQ实际筛选动态LINQ

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人,喜欢在那里不被应用,我做错了什么?

我也想能够通过名称列表,并只返回

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 

回答

2

的问题是,如果不变化集合。它返回新过滤的集合。

试试这个:

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是指定的名称 - 它不会是鲍勃戴夫!我想你真正想要的东西可以更简单地表示:

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

+0

它是在最后的代码段中,我希望能够传递名称列表,添加每个名称的where子句,在该示例中,我期望列出(Person)列表中的2个项目Bob &Dave – Eric 2009-09-10 16:51:53

+0

就是这样!这正是我想传达的。谢谢 – Eric 2009-09-10 16:55:22

+0

@Jon:我不知道语法。你可以用JOIN来举例说明第二种情况吗? – shahkalpesh 2009-09-10 16:55:31

0
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