Левое внешнее соединение на странной модели данных в LINQ - PullRequest
1 голос
/ 07 ноября 2010

У меня есть класс, который выглядит следующим образом:

public class KpiValue
{
    public string ID { get; set; }

    public string NAME { get; set; }

    public string ORG_UNIT_ID { get; set; }

    public string SITE_ID { get; set; }

    public string AREA_ID { get; set; }

    public double? VALUE { get; set; }

}

И соответствующие классы Site, Area, Organization и OrgUnit, каждый со свойством ID.Только одно из свойств будет иметь значение, остальные будут нулевыми (не моя идея).

Я хотел бы преобразовать эту структуру в нечто полезное, назначив свойство NAME, которое выглядит следующим образом:

"Область: моя первая область" или "Сайт: лучший сайт когда-либо"

Состоит из ИМЯ сайта или области или организации и т. Д., Соответствующих соответствующему свойству идентификатора (AREA_ID или SITE_ID или..) моего класса.

Предполагая, что я уже получил это ...

var org = Organization.FindByProperty("NAME",orgName);

var orgUnits = org.GetOrgUnits().AsEnumerable();

var sites = from OrgUnit ou in orgUnits
            from Site s in ou.GetSites()
            select s;

var areas = from Site s in sites
            from area in s.Areas()
            select area;

//help!
var monthlyGrid = from KpiValue monthlyKpi in kpiMonthlyValues
                  join area in areas on monthlyKpi.AREA_ID equals area.ID
                  join site in sites on monthlyKpi.SITE_ID equals site.ID
                  join orgUnit in orgUnits on monthlyKpi.ORG_UNIT_ID equals orgUnit.ID
                  select new monthlyKpi()
                  {
                   NAME = //"Area: MyArea" or "Site: MySite"
                   ...
                   };

Соединение, похоже, соответствует условиям И, а не ИЛИ ... Какя могу добиться этого в LINQ?

1 Ответ

0 голосов
/ 07 ноября 2010

Посмотрите на пример внешнего левого соединения на сайте Linq 101 .

Вам необходимо использовать Enumrable.DefaultIfEmpty.

...