拥有以下课程(高度简化):
public class Child
{
public string Label;
public int CategoryNumber;
public int StorageId;
}
public class Parent
{
public string Label;
public List<Child> Children = new List<Child>();
}
Run Code Online (Sandbox Code Playgroud)
并拥有以下数据:
var parents = new List<Parent>();
var parent = new Parent() {Label="P1"};
parent.Children.Add(new Child() {Label="C1", CategoryNumber=1, StorageId=10});
parent.Children.Add(new Child() {Label="C2", CategoryNumber=2, StorageId=20});
parents.Add(parent);
parent = new Parent() {Label="P2"};
parent.Children.Add(new Child() {Label="C3", CategoryNumber=1, StorageId=10});
parent.Children.Add(new Child() {Label="C4", CategoryNumber=2, StorageId=30});
parents.Add(parent);
parent = new Parent() {Label="P3"};
parent.Children.Add(new Child() {Label="C5", CategoryNumber=3, StorageId=10});
parent.Children.Add(new Child() {Label="C6", CategoryNumber=2, StorageId=40});
parents.Add(parent);
Run Code Online (Sandbox Code Playgroud)
现在,我如何从包含至少一个CategoryNumber = 1的孩子的父母列表中获取子列表(CategoryNumber = 2)?
我可以执行以下操作,但它似乎不是最佳的:
var validParents = from p in parents
where p.Children.Any (c => c.CategoryNumber==1)
select p;
var selectedChildren = validParents.Select(p => from c in p.Children
where c.CategoryNumber == 2
select c);
Run Code Online (Sandbox Code Playgroud)
这是我为selectedChildren获得的:
IEnumerable<IEnumerable<Child>>
IEnumerable<Child>
IEnumerable<Child>
是否可以只有一个包含两个子元素的平面列表而不是两个子列表?如何在LINQ中翻译?
Sco*_*vey 50
您可以使用SelectMany和Where将一对查询串在一起.
var selectedChildren = (from p in parents
where p.Children.Any (c => c.CategoryNumber==1)
select p)
.SelectMany(p => p.Children)
.Where(c => c.CategoryNumber == 2);
// or...
var selectedChildren = parents
.Where(p => p.Children.Any(c => c.CategoryNumber == 1))
.SelectMany(p => p.Children)
.Where(c => c.CategoryNumber == 2);
Run Code Online (Sandbox Code Playgroud)
Eri*_*ert 44
斯科特的回答很棒; 我只想指出你实际上可以使用查询延续语法来执行此查询:
from parent in parents
where parent.Children.Any (c => c.CategoryNumber==1)
select parent into p
from child in p.Children
where child.CategoryNumber == 2
select child
Run Code Online (Sandbox Code Playgroud)
注意"into"如何让您将一个查询的结果传递给下一个查询.漂亮,嗯?
| 归档时间: |
|
| 查看次数: |
45167 次 |
| 最近记录: |