2012-02-10 119 views
2

我正在使用包含两个表格的DataSet,我试图通过LINQ获取数据。如何使用LINQ来过滤集合到数据集

我很努力弄清楚如何返回符合条件的记录的语法。

实施例:

下面是两个表:

FooBar Items

FooBar Data

此查询连接两个表(商品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"]     
     }; 
} 

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

FooBar Items joined with FooBar Data

问:我怎么只返回美孚项目?

请注意,Foo项目在第一行中记录的是非空值,而Bar项目在第一行/记录中没有非空值。使用这样一个事实,即所有Foo项目在foo列中至少有一个非空值,并且Bar项目在foo列中永远不会有非空值,那么如何更新上述查询以便该查询仅返回Foo项目?同样,我如何更新查询,以便它只返回条款项目?

回答

1

这并不完全清楚,我什么标准是,作为一个富与一个酒吧,但这里有一些想法:

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); 
1

这取决于要过滤不需要的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

要获得其余的(包括那些foonull但他们还是克至富具有非空条目),使用.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的条目)。

+0

我喜欢你的想法与附加的lambda - 它看起来像会起作用,但它不。更新查询的结果返回与原始文件不同的集合。奇怪。 – Jed 2012-02-10 23:18:19

+0

@Jed:哦,发了一个错字。应该是'f.foo!= null',而不是'“”'。现在修复。 – 2012-02-10 23:21:35