2016-07-08 269 views
0

嵌套模型我有一個已經存在的類創建一個從列表

public class Employee 
{ 
    public int? EmployeeId { get; set; } 
    public string EmployeeName { get; set; } 
    public int? LocationId { get; set; } 
    public string LocationName { get; set; } 
    public int? DesignationId { get; set; } 
    public string DesignationName { get; set; } 
} 

代碼從數據庫中獲取數據:

using (var ds = new EmployeeDS()) 
       { 
        using (var dataAdapter = new DataSet.EmployeeDSTableAdapters.EmployeeTableAdapter()) 
        { 
        dataAdapter.FillEmployee(ds.Employee,Id); 
         var result = (from DataRow row in ds.Employee.Rows 
            select new Employee 
            { 
             EmployeeId = (row["EmployeeID"] == DBNull.Value) ? null : (int?)row["EmployeeID"], 
             EmployeeName = (row["EmployeeName"] == DBNull.Value) ? string.Empty : (string)row["EmployeeName"], 
             LocationId = (row["LocationId"] == DBNull.Value) ? null : (int?)row["LocationId"], 
             LocationName = (row["LocationName"] == DBNull.Value) ? string.Empty : (string)row["LocationName"], 
             DesignationId = (row["DesignationId"] == DBNull.Value) ? null : (int?)row["DesignationId"], 
             DesignationName = (row["DesignationName"] == DBNull.Value) ? string.Empty : (string)row["DesignationName"], 
            }).ToList(); 
        } 
       } 

其工作fine.But的員工該返回多行具有多個位置或所以我需要返回數據爲嵌套模型,如:

public class EmployeeNested 
    { 
     public int? EmployeeId { get; set; } 
     public string EmployeeName { get; set; } 
     public List<Location> Locations { get; set; } 
     public List<Designation> Designations { get; set; } 
    } 
    public class Location 
    { 
     public int? LocationId { get; set; } 
     public string LocationName { get; set; } 
    } 
    public class Designation 
    { 
    public int? DesignationId { get; set; } 
    public string DesignationName { get; set; } 
    } 

我是usi NG驗證碼返回嵌套模式:

var tempList=result.GroupBy(x => x.EmployeeId, (key, g) => g.OrderBy(e => e.EmployeeId).First()); 
        foreach (var item in tempList) 
        { 
         item.Designations = result 
              .Where(x => x.EmployeeId== item.EmployeeId) 
              .Select(x => new Designation 
               { 
                DesignationId = x.DesignationId, 
                DesignationName = x.DesignationName 
               }).ToList(); 
         item.Locations = result 
              .Where(x => x.EmployeeId== item.EmployeeId) 
              .Select(x => new Location 
               { 
                LocationId = x.LocationId, 
                LocationName = x.LocationName 
               }).ToList(); 
        } 

問:

  • 有沒有更好的解決方案,以扁平列表轉換爲嵌套表?

  • 是否有可能創建一個通用的方法來將平板列表轉換爲 嵌套列表?這樣我就可以將它重用於其他功能。

  • 是否可以直接從數據集創建嵌套列表?

我確信有這樣一個很好的可靠模式,我只是找不到它。

回答

0

我不認爲有一種方法可以從數據集創建嵌套列表,而不是循環遍歷結果和一些編程邏輯。如果你使用關係型數據庫,我會建議使用實體框架,一旦你的數據庫被正確配置好了,它會生成類似於你的EmployeeNested類的東西。

+0

不,表格之間沒有關係。並且還在整個項目中使用了數據集。所以我做了什麼是正確的方式來實現嵌套列表? – Binu

0

有沒有更好的解決方案將平面列表轉換爲嵌套List ?.

據我所知,更好的解決方案是創建實用工具方法,它將輸入列表並將其處理成另一種類型的列表。請參閱下面的示例代碼。

public static List<EmployeeNested> ProcessEmployeeData(List<Employee> result) 
     { 
      return result.Where(x => x.EmployeeId.HasValue).GroupBy(x => x.EmployeeId.Value).Select(x => new EmployeeNested 
      { 
       EmployeeId = x.Key, 
       EmployeeName = x.First().EmployeeName, 
       Locations = x.Select(s => new Location 
       { 
        LocationId = s.LocationId, 
        LocationName = s.LocationName 
       }).ToList(), 
       Designations = x.Select(s => new Designation 
       { 
        DesignationId = s.DesignationId, 
        DesignationName = s.DesignationName 
       }).ToList() 
      }).ToList(); 
     } 

是否有可能創建一個平面列表轉換爲 嵌套列表泛型方法?這樣我就可以將它重用於其他功能。

我們不能通用的方法,除非如果它繼承的全部財產共同財產,而一般的方法是如何知道,在收集需要增加一些特定的對象。如果有方法,那麼實施起來會很複雜。

是否可以直接從數據集創建嵌套列表?

根據我的理解,我們不能直接從數據集進行嵌套收集,因爲數據集不知道我們想要綁定從數據庫中獲取的數據的哪種類型的集合。如果你想直接進行收集,那麼必須有一個根據我們的模型來查詢數據庫並綁定的底層結構,這就是ORM框架如何像實體框架一樣工作。