【问题标题】:How to filter a collection using LINQ to DataSet如何使用 LINQ to DataSet 过滤集合
【发布时间】:2012-03-03 07:16:06
【问题描述】:

我正在使用包含两个表的 DataSet,我试图通过 LINQ 从中获取数据。

我正在努力弄清楚如何返回满足条件的记录的语法。

例子:

这是两张表:

此查询连接两个表(项目 Z 将被过滤掉)

private void ParseFooBar()
{
 ....
 var fooBars = from item in fooBarItems 
      join data in fooBarData on item["FooBar_Id"] equals data["FooBar_Id"]
      where (new[] {"A","B","C"}).Contains(item["id"])
      select new
      {
      id = item["id"],
      description = item["description"],
      wat = data["wat"],
      foo = data["foo"]                 
      };
}

这是从上述查询派生的集合。

问题:如何只退回 Foo 商品?

注意 Foo 项目如何在其第一行/记录中具有非空值,而 Bar 项目在第一行/记录中没有非空值。使用所有 Foo 项在 foo 列中至少有一个非空值并且 Bar 项在 foo 列中永远不会有非空值这一事实,我如何更新上述查询以使查询仅返回 Foo 项?同样,如何更新查询以使其仅返回 Bar 项目?

【问题讨论】:

    标签: c# linq dataset linq-to-dataset


    【解决方案1】:

    我并不完全清楚 Foo 与 Bar 的标准是什么,但这里有一些想法:

    var foos1 = fooBars.Where(fb => fb.wat != "bar");
    var foos2 = fooBars.Where(fb => fb.wat == "foo" || fb.wat == null);
    var foos3 = fooBars.Where(fb => fb.wat == "foo" || fb.foo != null);
    var bars = fooBars.Where(fb => fb.wat == "bar" || fb.foo != null);
    

    【讨论】:

      【解决方案2】:

      这取决于您要在哪里过滤掉不需要的nulls。如果在加入级别,您可以稍微更改您的查询:

      from item in fooBarItems 
      join data in fooBarData on item["FooBar_Id"] equals data["FooBar_Id"]
      where (new[] {"A","B","C"}).Contains(item["id"]) && data["foo"] != null
      select new
      {
         id = item["id"],
         description = item["description"],
         wat = data["wat"],
         foo = data["foo"]                 
      };
      

      这将只返回两个元素:

      • A, I am a Foo, null, 10834
      • B, I am a Foo, null, 08385383

      要获得剩余的(包括那些foo null 但它们属于具有非空条目的Foo),请在之后使用.GroupBy.Where 的组合您的主要查询:

      fooBars
          .GroupBy(f => f.id)
          .Where(g => g.Any(f => f.foo != null))
          .SelectMany(g => g); // just to make it nice list-like looking
      

      这将选择整个组,但只选择至少一个具有非空值的foo 的组(这将是最终集合中的所有条目,id = C 除外)。

      【讨论】:

      • 我喜欢你的附加 lambda 的想法 - 看起来它可以工作,但它没有。更新查询的结果返回的集合与原始集合没有什么不同。奇怪。
      • @Jed:哦,打错了。应该是f.foo != null,而不是""。现已修复。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-26
      • 2011-04-21
      相关资源
      最近更新 更多