簡體   English   中英

選擇查詢以使用linq根據不同的值獲取所有值

[英]select query to get all values based on distinct values using linq

我有n個服務,每個服務下有2條路線(有時超過2條路線)。 在每個路線下都有n個站點。 我從數據庫中以表的形式按以下列順序獲取值:ServiceId,Service Name,serviceLine color,RouteId,Route Name,停止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中有什么簡單的方法可以將數據轉換為以下格式? 我想避免循環..因為我從數據庫獲取了近1k條記錄。 請幫我解決這個問題。

還是最好使用db調用來格式化數據。 我不喜歡這樣做,因為如果有50個服務,我需要執行50個數據庫調用,然后再次必須執行數據格式化邏輯。

為了避免每次都遍歷數據結構,您可以建立其他字典,這些字典可通過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 
    }
}

您有許多停靠點,對於數據庫中的每個停靠點條目,都必須將其映射到C#對象。 據我所知,在這種情況下,循環是不可避免的。 Linq,例如。 實體框架,在內部使用循環。

一種選擇是使用實體框架或Linq to SQL 它將為您提供代表每個數據庫表的強類型類。 但是您必須更改數據庫架構,並使用外鍵鏈接服務,路由和停止。

C#代碼看起來與您的代碼完全一樣,它由實體框架自動生成並與DB模式同步。

第二種選擇是手動轉換 請注意,您當前的架構不符合Third normal form 如果您不想更改架構,則可以使用group by子句讀取並生成它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM