2012-04-24 65 views
2

我有一个带CheckedListBox的表单,用户可以在其中选择多个选项(它正在筛选目录文件列表 - 筛选的文件出现在第二个列表框中)。在LINQ条件查询中使用“或”

如果我有选择的一组号码,我可以在这样的查询使用“或”:

Dim query = From f As System.IO.FileInfo In StartList 
    Where f.Name.Contains("Romania") 
Where f.Channel = "Channel1" Or f.Channel = "Channel2" 

但随着人可以点击任意数量的选项(或没有)我不能这样做这个。 我已经尝试了几件事情,包括尝试创建多个子查询,然后对它们执行联合,但是我无法使其工作。

这是到目前为止我的代码:

Dim Channels = ChannelListBox.CheckedItems 

    Dim query = From f As System.IO.FileInfo In StartList 
    Where f.Name.Contains("Romania") 

    If Channels.Count > 0 Then 

     Dim CurrentName As String = Channels(0).ToString 

     Dim Subquery = From g As System.IO.FileInfo In query 
       Where (g.Name.Contains(CurrentName)) 

     For i = 1 To Channels.Count - 1 

      CurrentName = Channels(i).ToString 
      Dim Subquery2 = From h As System.IO.FileInfo In query 
           Where (h.Name.Contains(CurrentName)) 

      Subquery = Subquery.Union(Subquery2) 

     Next i 

     FileListBox.DataSource = Subquery.ToList 

    Else 

     FileListBox.DataSource = query.ToList 

    End If 

感谢您的帮助, 安德鲁

+0

我认为[Predicate Builder](http://www.albahari.com/nutshell/predicatebuilder.aspx)是你正在寻找的! – Flowerking 2012-04-24 12:25:18

回答

0
Dim Channels = ChannelListBox.CheckedItems 
Dim ChannelNames = From c.ToString In Channels 
Dim query = From f As System.IO.FileInfo In StartList 
    Where f.Name.Contains("Romania") And ChannelNames.Any(Function(n) f.Name.Contains(n)) 

我没有经验VB.NET,更不用说使用LINQ,所以我希望我的语法是正确的。这里是我会写在C#中:

var channels = ChannelListBox.CheckedItems; 
var channelNames = channels.Select(c => c.ToString()); 
var query = from f in StartList.Cast<System.IO.FileInfo>() 
    where f.Name.Contains("Romania") && channelNames.Any(n => f.Name.Contains(n)) 
    select f; 
+0

还没意识到我太无礼了,以至于不能谢谢你,所以我们现在迟了近三年:谢谢! – 2015-01-21 18:01:55

+0

不客气! :-) – Andrew 2015-01-24 02:57:21