Выбор отдельных объектов из коллекции объектов с использованием лямбда-выражений - PullRequest
0 голосов
/ 27 июля 2010

У нас есть проект, использующий Fluent NHibernate. Существует объект под названием BluePart со свойством Oem типа Oem.

public class BluePart : DomainEntity
{
    ...
    public virtual Oem Oem { get; set; }
}

Объект Oem имеет несколько свойств, включая OemCode и OemDescription.

public class Oem : DomainEntity
{
    ...
    public virtual string OemCode { get; set; }
    public virtual string OemDescription { get; set; }
}

Я пытаюсь создать запрос linq с использованием лямбда-выражений, которые будут получать все отдельные Oems из списка BlueParts (2,7 миллиона записей). В идеале он должен производить следующий sql (который работает <1сек): </p>

select distinct o.OemCode, o.OemDescription 
From BluePart b inner join Oem o on o.OemId = b.Oem_id

Ниже приведен построенный мной запрос, который возвращает все Oems, независимо от различий.

var oem = repository.Query<BluePart>().Select(x => new Oem { OemCode =
x.Oem.OemCode, OemDescription = x.Oem.OemDescription}).ToList();

Я думал, что этот запрос будет легко построить, но это не так. При запуске GroupBy (.GroupBy (z => z.OemCode)) я получаю сообщение об ошибке, в котором говорится, что свойство, которое я пытаюсь использовать для GroupBy, не является свойством Bluepart (чего не должно быть, поскольку я группирую свойство Oem)

1 Ответ

1 голос
/ 27 июля 2010

Как насчет:

var oem = repository.Query<BluePart>()
                    .Select(x => new { OemCode = x.Oem.OemCode, 
                                       OemDescription = x.Oem.OemDescription})
                    .Distinct()
                    .ToList();

Это только даст вам отдельные пары код / ​​описание, но, похоже, это все, что вас интересует.

В качестве альтернативы, используя группировку:

var oem = repository.Query<BluePart>()
                    .GroupBy(x => new { OemCode = x.Oem.OemCode, 
                                        OemDescription = x.Oem.OemDescription})
                    .ToList();

Это даст вам все BluePart объекты, сгруппированные по коду / описанию OEM.

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