我正在尝试使用LINQ在适当的地方查询对象列表。目前我坚持使用嵌套查询的语法,希望你能帮助我。
类:
public class FooType
{
public int Id { get; set; }
public IList<Foo> Foos { get; set; }
}
public class Foo
{
public int FooTypeId { get; set; }
public string CorrelationId { get; set; }
}
public class Bar
{
public string FooCorrelationId { get; set; }
}
用法:
IList < FooType > fooTypes = new List < FooType >();
// ... add a lot of FooTypes, each enriched with some Foos
Bar bar = new Bar(){FooCorrelationId = "abcdef"};
Foo foo = fooTypes.Where( ft => ft.Foos.Where( f => f.CorrelationId == bar.FooCorrelationId ) ).First<Foo>();
这会失败,因为外部WHERE表达式被提供了一些不提供布尔返回值的东西。正如您可能猜到的那样,我打算在LINQ中使用以下内容:
foreach (FooType fooType in fooTypes)
{
Foo foo = fooType.Foos
.Where(f => f.CorrelationId == bar.FooCorrelationId)
.First();
}
你知道如何获得我正在寻找的Foo,一个有CorrelationId“abcdef”吗?
对于基准测试员还有一个问题:性能怎么样? LINQ是否优化了它的查询?或者结果与对象的迭代相同,就像我在“类似”块中所做的那样?
提前多多感谢!
答案 0 :(得分:4)
只需用SelectMany替换外部,然后获取第一个
Foo foo = fooTypes
.SelectMany(ft => ft.Foos.Where(f => f.CorrelationId == bar.FooCorrelationId))
.First();
如果您要在所有FooType中获得第一个Foo,那么CorrelationId == FooCorrelationId。