2009-01-07 11 views
1

J'ai plusieurs tables centrées autour d'une table d'organisation qui contient simplement une valeur d'ID unique. Chaque organisation peut alors être à un endroit particulier et avoir un nom particulier. La partie délicate est que les organisations prennent en charge les changements d'emplacement et de nom avec une date d'entrée en vigueur spécifiée de chaque changement. Pour cet exemple, j'ai 4 tableaux pertinents:Syntaxe LINQ to SQL Query

Organisation: ID (PK, int, identité)

Lieu: ID (PK, int, identité), nom (varchar), AltLat (float), AltLong (flotteur)

organization_locations: organization_id (FK, int), le lieu (FK, int), eff_date (datetime)

organization_names: organization_id (FK, int), nom (ntext), eff_date (datetime), icône (nvarchar (100))

Ce que j'ai besoin de récupérer est la liste de tous les emplacements avec toutes les organisations à un endroit donné à une date spécifique et les projeter dans mes entités commerciales. En d'autres termes, j'aurai une date fournie et je devrais retourner pour chaque emplacement, l'organisation liée à l'entrée organization_location avec le plus récent eff_date qui est inférieur à la date fournie. La même chose vaut pour chaque organisation, j'aurais besoin du nom à la date.

Voici ce que j'ai commencé avec, mais il ne semble pas fonctionner:

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}} 

Je préfère la syntaxe VB mais si vous ne pouvez me donner une requête C# je peux travailler avec ça. J'ai essayé quelques autres variations mais je finis par obtenir des erreurs de syntaxe sur un "}" attendu ou des membres ne faisant pas partie d'un ensemble d'entités, peu importe la combinaison de parenthèses que j'essaie.

+0

"Ne semble pas fonctionner" - mauvais résultats, ou exception du compilateur? Plus de détails s'il vous plaît. –

Répondre

0

je fini par obtenir ce travail en utilisant le code suivant:

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}} 

Merci de prendre le temps de regarder ça!

0

Je pense que je comprends ce que vous essayez de faire ici, et il semble que certaines jointures simples pourraient se débarrasser de toutes les choses complexes que vous faites à la fin de votre requête. (Il est en C#, mais il devrait être assez simple pour l'obtenir à 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} 

Laissez-moi savoir si cela fonctionne ou si elle a besoin d'un réglage fin ...

0

J'ai besoin le plus récent (à une date donnée) emplacement pour une organisation et le nom d'une organisation pris en considération. Pas seulement tous avant la date. Par exemple, prenez le président américain élu Obama. Dans cet exemple, il y a trois endroits: sa maison, l'hôtel Hay-Adams et la Maison-Blanche. Il a également remporté 3 titres au cours des derniers mois: le sénateur Obama, le président élu Obama et bientôt le président Obama.

Si vous deviez passer la date "1/1/2008" dans cette requête, vous devriez récupérer tous les 3 emplacements, avec "Senator Obama" (l'organisation_name) tombant dans sa "maison" (l'organisation_location) et les deux autres endroits ne devraient pas avoir «d'organisations» en leur sein en utilisant notre échantillon. Si vous deviez passer la date du "01/12/2008", il vivait encore techniquement chez lui mais il avait alors le titre de "Président élu Obama" donc les résultats le refléteraient. Si vous deviez passer la date d'aujourd'hui, son nom serait toujours "Président élu Obama" mais son emplacement a changé pour "l'Hôtel Hay-Adams". Si vous passez une date après "20/01/2009", son titre sera "Président Obama" et sa localisation sera "La Maison Blanche". J'espère que cela a du sens, même si vous n'avez aucun intérêt pour la politique ou que vous n'êtes pas originaire des États-Unis. J'ai besoin des résultats pour me montrer où tout était et comment tout a été appelé à un moment donné.