通过两个集合LINQ

时间:2017-04-06 13:11:31

标签: c# wpf linq

是否可以使用LINQ迭代两个集合?

我有ObservableCollection我想填写,目前我只是使用典型的foreach循环。

我使用一个循环遍历一个string数组,而不是使用该值我检查每个bool值是否为true并将该值添加到Collection中。

public ObservableCollection<StaffInfo> Display = new ObservableCollection<StaffInfo>();

    public void MasterDataDisplay()
    {
        string[] data = new[] {"a", "b", "c"};

        foreach (var section in data)  
        {
            var filter = Db.StaffInfos.Where(p => p.Section == section);
            foreach (var item in filter)
            {
                if (item.CurrentStaff == true)
                {
                    Display.Add(item);
                }
            }
        }
    }

是否可以使用单个LINQ查询执行此类操作?或者我正在做的最好的方法是什么?

2 个答案:

答案 0 :(得分:3)

不确定。您基本上是在寻找CurrentStaff属性为true且Section属性包含在data集合中的项目:

Display = new ObservableCollection<StaffInfo>(
                 Db.StaffInfos
                   .Where(p => p.CurrentStaff == true
                            && data.Contains(p.Section))
              );

关于Contains的好处是它在SQL中创建了一个IN子句,因此您可以在一个查询中而不是在3中获取数据。

答案 1 :(得分:1)

您的代码从数据库中读取数据并检查其值。您无需循环执行此操作,只需重写代码即可执行单个查询:

var items=from item in  Db.StaffInfos
          where data.Contains(item.Section) && item.CurrentStaff
          select item;
Display.AddRange(items);

或同等的:

var items=Db.StaffInfos
            .Where(item => data.Contains(item.Section) && item.CurrentStaff);
Display.AddRange(items);

这里的“技巧”是someData.Contains(field)。包含被转换为field IN (data1, data2,data3)子句