C#LINQ子查询(在实体上)

时间:2010-10-04 08:09:15

标签: c# linq linq-to-entities

我正在尝试使用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是否优化了它的查询?或者结果与对象的迭代相同,就像我在“类似”块中所做的那样?

提前多多感谢!

1 个答案:

答案 0 :(得分:4)

只需用SelectMany替换外部,然后获取第一个

Foo foo = fooTypes
    .SelectMany(ft => ft.Foos.Where(f => f.CorrelationId == bar.FooCorrelationId))
    .First();

如果您要在所有FooType中获得第一个Foo,那么CorrelationId == FooCorrelationId。