LINQ Group结果并从另一个表中进行选择

时间:2015-06-23 20:45:31

标签: c# sql linq relational-database

我有以下数据库结构:

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

但我得到的是,对于每个功能,都有一个具有相同ID的功能列表。我怎么才能得到, 对于每个要素,其细分中的坐标列表?也就是说,我想拥有以下内容 结果出于查询:

[
    {
        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    

(点是,每个细分市场有1个特征,但每个区域有多个地理数据 公里。此外,我想要的解决方案不依赖于它的独特性 每段的特征,如果可能的话)

1 个答案:

答案 0 :(得分: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()
}