选择查询以使用linq

时间:2017-06-08 09:30:17

标签: c# linq lambda

我有n个服务,每个服务下会有2个路由(有时超过2个)。在每条路线下有n个站点。我从db获取值作为下面列顺序的表 ServiceId,服务名称,serviceLine颜色,RouteId,路由名称,Stop ID,停止名称,纬度,经度。

我想将其转换为以下格式的对象列表

 public class Service
    {
        public string ServiceId { get; set; }
        public string ServiceName { get; set; }
        public string ServiceLineColor { get; set; }
        public List<RouteData> RouteList { get; set; }
    }
    public class RouteData
    {
        public string RouteId { get; set; }
        public string RouteCode { get; set; }
        public string RouteName { get; set; }
        public List<StopData> stopList { get; set; }
    }
    public class StopData
    {
        public string StopCode { get; set; }
        public string StopName { get; set; }
        public string Latitude { get; set; }
        public string Longitude { get; set; }
        public string StopType { get; set; }
    }

linq有什么简单的方法可以将数据转换成以下格式吗?我想避免循环..因为我从db获得了近1k的记录。请帮我解决这个问题。

或者最好使用db调用来格式化数据。我不喜欢这样,因为如果有50个服务,我需要做50个db调用,并再次做数据格式化逻辑。

2 个答案:

答案 0 :(得分:0)

为了避免每次循环数据结构,您可以构建其他字典,通过id快速访问对象:

var myServiceIndex = new Dictionary<string, Service>()
var myRouteDataIndex = new Dictionary<string, RouteData>()

Service service;
RouteData routData;

foreach (var record in databaseRecords)
{
    if (myRouteDataIndex.TryGetValue(record.RouteId, out route))
    {
        // add stop data
    }
    else if (myServiceIndex.TryGetValue(record.ServiceId, out service)
    {
        // add route data
        // add stop data 
    }
    else
    {
        // add service
        // add route data
        // add stop data 
    }
}

答案 1 :(得分:0)

您有许多停靠点,对于数据库中的每个停止条目,您必须将其映射到C#对象。在这种情况下,据我所知,循环是不可避免的。 Linq,例如。实体框架,在内部使用循环。

一种选择是使用实体框架或Linq to SQL 。它将为您提供代表每个数据库表的强类型类。但是您必须更改数据库架构并使用外键来链接服务,路由和停止。

C#代码看起来与您的完全一样,由实体框架自动生成并与数据库架构同步。

第二个选项是手动转换。请注意,您当前的架构不符合Third normal form。如果您不想更改架构,可以使用group by子句读取并生成它们。