将两步LINQ查询转换为单个LET查询?

时间:2013-04-18 03:58:19

标签: c# linq

我目前有以下代码:

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)
                })  

但是(let a)中返回的数据与预期结果不匹配,返回的内容如下:

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

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

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:6)

听起来你需要来自小组的SelectMany

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

答案 1 :(得分: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));