C # LINQ подзапрос (по объектам) - PullRequest
1 голос
/ 04 октября 2010

Я пытаюсь использовать 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 Ответ

4 голосов
/ 04 октября 2010

Просто замените внешнее где на SelectMany и получите первый

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

Если вы хотите получить первый Foo для всех типов FooType, у чего есть CorrelationId == FooCorrelationId.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...