我有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调用,并再次做数据格式化逻辑。
答案 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
子句读取并生成它们。