【问题标题】:Iterating through two collections LINQ遍历两个集合 LINQ
【发布时间】:2017-04-06 13:11:31
【问题描述】:

是否可以使用 LINQ 遍历两个集合?

我有一个 ObservableCollection 我正在尝试填充,目前我只是在使用典型的 foreach 循环。

我使用一个循环遍历 string 数组,然后使用该值检查每个 bool 值是否为真,然后将该值添加到集合中。

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 查询来做这样的事情?还是我正在做的最好的方法是做到这一点?

【问题讨论】:

标签: c# wpf linq


【解决方案1】:

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

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

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

【讨论】:

  • UV 谢谢,我从没想过像这样使用contains
  • 你如何引用 AddRange 到 observable 集合?
  • @KyloRen 抱歉,请参阅我的编辑。您需要使用构造函数一次性添加数据(而不是循环调用Add)。
  • 啊,好的,所以我只需要为此做一个扩展。但是,我从未见过Addrange 扩展。必须对此进行研究。
  • @KyloRen 当然可以,但请注意调用Add 会触发CollectionChanged 事件,而使用构造函数则不会。
【解决方案2】:

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

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) 子句

【讨论】:

  • +1,这确实清楚地说明了如何做这样的事情。由于我发布的查询只是一个简化的查询。谢谢。
  • @KyloRen 您应该将任何包含数据访问的循环视为烫手山芋。几乎总有一种方法可以将其转换为仅执行 1 次往返的单个查询。否则你会得到 N 个远程调用
猜你喜欢
  • 2021-09-06
  • 2018-12-10
  • 2016-02-06
  • 1970-01-01
  • 1970-01-01
  • 2014-04-11
  • 2021-11-27
  • 1970-01-01
相关资源
最近更新 更多