2013-04-18 24 views
2

目前,我有以下代码:将两步LINQ查询转换为单个LET查询?

var data = /* enumerable containing rows in your table */; 
var part = "X"; 
var items = new HashSet<int>(data 
    .Where(x => x.PartName == part) 
    .Select(x => x.ItemName)); 
var query = data.Where(x => items.Contains(x.ItemName)); 

items发现与特定PartName数据的所有项目。

query返回该项目的所有数据记录。

我需要将其转换为一个单独的LET语句(或其他),我可以使用嵌入在另一个更大的LINQ查询。

例如,如果我的数据如下(记录):

ItemName PartName 
1  A 
1  B 
2  A 
3  C 

我期待与部分项目“A”我需要的最终结果是:

1  A 
1  B 
2  A 

一个建议是做这样的事情:

let a = data.GroupBy(x => x.ItemName) 
      .Where(g => g.Any(x => x.Partname == part)) 
      .Select(g => new 
       { 
        ItemName = g.Key, 
        PartNames = g.Select(x => x.PartName) 
       }) 

然而,返回的数据(让a)不符合预期的重新这返回类似于:

1  A,B // list of parts for that item 
2  A 

而且我需要保持与上面所示相同的预先存在的结构。

任何帮助将不胜感激。

回答

6

听起来像是你需要从组SelectMany

data.GroupBy(x => x.ItemName) 
      .Where(g => g.Any(x => x.PartName == part)) 
      .SelectMany(g => g); 
+0

1+好的解决方案 – Damith 2013-04-18 04:28:12

0
var data = /* enumerable containing rows in your table */; 
var part = "X"; 
var query = data.Where(x => data 
    .Where(d => d.PartName == part) 
    .Any(d => d.ItemName == x.ItemName)); 
+0

'Contains'!这不会编译,我认为你应该使用'Any'。但这不是解决问题的好方法。 – Damith 2013-04-18 04:27:22

+0

然后会是什么? – JSchwartz 2013-04-18 04:53:41