LINQ to SQL Синтаксис запроса - PullRequest
       8

LINQ to SQL Синтаксис запроса

1 голос
/ 07 января 2009

У меня есть несколько таблиц, которые сосредоточены вокруг организационной таблицы, которая просто содержит уникальное значение идентификатора. Каждая организация может быть в определенном месте и иметь конкретное имя. Сложность заключается в том, что организации поддерживают изменения местоположения и имен с указанием даты вступления в силу каждого изменения. Для этого примера у меня есть 4 соответствующие таблицы:

Организация: ID (PK, int, identity)

Местоположение: ID (PK, int, identity), Имя (varchar), AltLat (float), AltLong (float)

organization_locations: organization_id (FK, int), местоположение (FK, int), eff_date (datetime)

имя_организации: идентификатор_организации (FK, int), имя (ntext), дата_эфф. (Дата / время), значок (nvarchar (100))

Мне нужно получить список всех местоположений вместе со всеми организациями в данном месте на определенную дату и спроецировать их в мои бизнес-объекты. Другими словами, у меня будет указана дата, и мне нужно будет вернуть для каждого местоположения организацию, связанную с записью Organization_location с самой последней eff_date, которая меньше указанной даты. То же самое относится к каждой организации, мне нужно было бы название на дату.

Вот то, с чего я начал, но, похоже, это не работает:

Dim query = From loc In dc.Locations _
           Where loc.AltLong IsNot Nothing And loc.AltLat IsNot Nothing _
           Select New AnnexA.Entities.AnnexALocation With {.ID = loc.ID, .Name = loc.Location, .Y = loc.AltLat, .X = loc.AltLong, _
                            .Units = From ol In loc.organization_locations Let o = ol.Organization.organization_names.Where(Function(ed) (ol.eff_date < Date.Parse("1/1/2011"))).OrderByDescending(Function(od) (od.eff_date)).First() Select New AnnexA.Entities.AnnexAMillitaryUnit With {.ID = o.ID, .Name = o.name, .IconPath = o.icon}}

Я бы предпочел синтаксис VB, но если вы можете дать мне только запрос C #, я могу работать с этим. Я пробовал несколько других вариантов, но в итоге получаю синтаксические ошибки об ожидаемом "}" или членах, не являющихся частью набора сущностей, независимо от того, какую комбинацию скобок я пытаюсь использовать.

Ответы [ 3 ]

0 голосов
/ 08 января 2009

Мне нужно самое последнее (на определенную дату) местоположение организации и название организации с учетом. Не только все до даты. Например, возьмем избранного президента США Обаму. В этом примере есть 3 локации: его дом, гостиница Хей-Адамс и Белый дом. За последние пару месяцев он также получил 3 титула: сенатор Обама, избранный президент Обама и вскоре станет президентом Обамой.

Если вы должны были указать дату «01.01.2008» в этом запросе, вы должны вернуть все 3 местоположения, причем «Сенатор Обама» (имя_организации) попадает в его «дом» (название_организации) и в двух других местах не должно быть «организаций», использующих наш образец. Если вы укажете дату «01.12.2008», он все еще технически живет в своем доме, но тогда у него был титул «Избранный президент Обама», так что результаты будут отражать это. Если вы укажете сегодняшнюю дату, его имя все равно будет «Избранным президентом Обамой», но его местоположение изменилось на «Hay-Adams Hotel». Если вы укажете дату после «20.01.2009», его звание будет «Президент Обама», а его местонахождение - «Белый дом».

Я надеюсь, что это имело какой-то смысл, даже если вы не интересуетесь политикой или не имеете отношения к США. Мне нужны результаты, чтобы показать мне, где все было и как все называлось в данный момент времени.

0 голосов
/ 15 января 2009

Я получил это, используя следующий код:

Dim query4 = From loc In dc.Locations _
                 Let curNames = (From ons In dc.organization_names _
                                Where ons.eff_date <= ssDate _
                                Order By ons.eff_date Descending _
                                Group ons By ons.organization_id Into gNames = Group _
                                Select New With { _
                                    Key .Key = organization_id, _
                                    .Result = gNames.Take(1)}) _
                                    .SelectMany(Function(a) (a.Result)) _
                Let curLocs = (From oLocs In dc.organization_locations _
                               Where oLocs.eff_date <= ssDate _
                               Order By oLocs.eff_date Descending _
                               Group oLocs By oLocs.organization_id Into gLocs = Group _
                               Select New With { _
                                Key .Key = organization_id, _
                                .Result = gLocs.Take(1)}) _
                                .SelectMany(Function(a) (a.Result)) _
                Where loc.AltLat IsNot Nothing And loc.AltLong IsNot Nothing _
                Select New AnnexA.Entities.AnnexALocation With { _
                    .ID = loc.ID, .Name = loc.Location, .Y = loc.AltLat, .X = loc.AltLong, _
                    .Units = From curLoc In curLocs _
                             Where curLoc.location = loc.ID _
                             From curName In curNames _
                             Where curName.organization_id = curLoc.organization_id _
                             Select New AnnexA.Entities.AnnexAMillitaryUnit With { _
                                .ID = curLoc.organization_id, _
                                .Name = curName.name, _
                                .IconPath = curName.icon}}

Спасибо, что нашли время взглянуть на это!

0 голосов
/ 07 января 2009

Мне кажется, я понимаю, что вы пытаетесь сделать здесь, и похоже, что некоторые простые объединения могут избавиться от всего сложного, что вы делаете в конце вашего запроса. (Это в C #, но это должно быть довольно просто, чтобы получить его в VB)

from loc in dc.Locations
join ol in dc.organization_locations on loc.ID equals ol.location
join orn in dc.organization_names on ol.organization_id equals orn.organization_id
where loc.AltLong != null
  && loc.AltLong != null
  && ol.eff_date < Date.Parse("1/1/2011")
orderby ol.eff_date
select new AnnexA.Entities.AnnexAMillitaryUnit 
    { ID = loc.ID, Name = orn.name, IconPath = orn.icon}

Дайте мне знать, если это работает или требуется какая-то подстройка ...

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