2015-06-23 2 views
0

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

table RoadSegment 
    int SegmentID 
    double StartKm 
    double EndKm 

table GeographicData 
    double Km 
    double latitude 
    double longitude 

table RoadFeature 
    int FeatureID 
    int SegmentID 

И я хочу, чтобы выбрать список всех особенностей дорожного движения в пределах определенного диапазона километров, но я хотел бы также к получить все географические координаты в каждый сегмент функции. Есть ли в любом случае я могу сделать это только в одной поездке в базу данных (один оператор LINQ)? Я пробовал следующее:

from feat in RoadFeature 
from geo in GeographicData 
join seg in RoadSegment on feat.SegmentID equals seg.SegmentID 

where geo.Km >= seg.StartKm && geo.Km <= seg.EndKm 

group feat by feat.FeatureID into grp 

select new { 
    Feature = grp.Key, 
    GeoData = grp.ToList() 
} 

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

[ 
    { 
     FeatureID: 1, 
     GeoData: [ 
      [-11.786783, 22.4567864], 
      [-11.654684, 22.6546548], 
      [-11.646648, 22.7867544] 
     ] 
    }, 

    { 
     FeatureID: 2, 
     GeoData: [ 
      [-11.111265, 22.4118787], 
      [-11.568746, 22.6546548], 
      [-11.124687, 22.0121571] 
     ] 
    } 
] 

Некоторые данные:

RoadSegment 
    ID  StartKm  EndKm 
    41  57.6  69.4 
    42  69.4  80 
    43  80   86.5 
    44  86.5  92.2 
    45  92.2  126 
    46  126   132 

RoadFeature 
    FeatureID SegmentID 
    1   41 
    2   42 
    3   43 
    4   44 
    5   45 
    6   46 

GeographicData 
    Km   latitude  longitude 
    57.62  -19.959059  -44.339733   
    57.622  -19.959121  -44.339793   
    57.631  -19.959182  -44.339857   
    57.641  -19.959249  -44.339922   
    57.651  -19.959317  -44.339989   
    57.661  -19.959387  -44.340062   
    57.672  -19.959465  -44.340145   
    57.684  -19.959548  -44.340232   
    57.697  -19.959632  -44.340322   
    57.71  -19.959721  -44.340419   
    57.724  -19.959815  -44.340522   
    57.739  -19.959913  -44.34063   
    57.755  -19.960013  -44.340739   
    57.771  -19.960114  -44.340846   
    57.787  -19.960213  -44.34095  

(Точка, есть одна особенность в сегменте, но многое гео-данных на километр. Кроме того, я хотел бы решение, которые не полагаются на уникальности функции на сегмент, если это возможно)

+0

могли бы вы опубликовать некоторые данные? – Noctis

+0

@Noctis да, только что отредактировал :) –

ответ

0

Думают, вы просто нужно добавить geo в вашей группировке.

Затем вы можете выбрать эти данные в своем анонимном типе.

Так

from feat in RoadFeature 
from geo in GeographicData 
join seg in RoadSegment on feat.SegmentID equals seg.SegmentID 

where geo.Km >= seg.StartKm && geo.Km <= seg.EndKm 

group new {feat, geo} by feat.FeatureID into grp 

select new { 
    Feature = grp.Key, 
    GeoData = grp.Select(x => x.geo).ToList() 
} 
Смежные вопросы