2016-10-24 60 views
0

來自JS/PHP/Node的背景,對C#應用程序開發有些新鮮。在MVC應用上工作。隱藏IEnumerable到另一個IEnumerable C#

我需要從我的服務中返回一個對象IEnumerable<Car>到我的控制器。我的服務調用我的存儲庫返回IEnumberable<CarEntity>

我想不出如何將CarEntity列表轉換爲Car列表。

汽車看起來像

public int CarId { get; set; } 
    public string CarColor { get; set; } 
    public string CarMake { get; set; } 
    public string CarModel { get; set; } 

和CarEntity看起來像

public int Id { get; set; } 
    public string Color { get; set; } 
    public string Make { get; set; } 
    public string Model { get; set; } 
    public string SomeOtherProp { get; set;} 

這是一個例子,但是這通常是我需要的。我是否需要通過我的CarEntity列表進行某種循環,並將每個列表推送到Car列表中?我會認爲這樣做有一些更精明的方法。

+0

或您的車輛實體可以繼承車輛 – Steve

回答

3

是的。您需要爲汽車實體列表集合中的每個項目創建一個新的Car對象並分配屬性值。你可以做,在foreach循環

var carEntityList= new List<CarEntity>(); //assume this has items 
var carList = new List<Car>(); 
foreach(car carEntity in carEntityList) 
{ 
    var c= new Car(); 
    c.CarId =carEntity.Id; 
    // to do : Map other property values as well. 
    carList.Add(c);  
} 

或者使用便捷LINQ擴展方法如IEnumerable.Select

var carEntityList= new List<CarEntity>(); //assume this has items 
var carList = carEntityList.Select(s=>new Car { 
               CarId = s.Id, 
               CarColor = s.Color, 
               CarModel = s.Model, 
               CarMake = s.Make 
               } 
           ); 
+0

另外,如果您經常需要從CarEntities製作Cars,則接受CarEntity的Car的構造方法可以大大簡化事情,並且出錯的可能性更小。 – PMV

+0

感謝您的雙方,應該提到我使用LINQ。使用LINQ,如果輸入和輸出碰巧具有相同的確切屬性,我可以設置carList = carEntityList,還是仍然需要轉換?如果我必須轉換,那麼當屬性的輸入和命名方式相同時,是否有一個快捷方式?只是好奇。謝謝 –

+1

你不能那樣做,因爲兩者都是不同的類型集合。您將收到編譯時錯誤,指出collectionX無法轉換爲collectionY !.所以你需要這樣做創建對象集屬性值的東西。如果您使用的是LINQ,只需使用「Select」擴展方法,正如我在答案的第二部分所示。 – Shyju

2

長手的方法是使用上IEnumerable<T> LINQ的.Select擴展方法來project一個項目從一個集合到另一個集合:

IEnumberable<CarEntity> carEntities = repository.GetCars(); 

IEnumerable<Car> cars = 
    carEntities 
    .Select(c => 
     new Car 
     { 
      CarId = c.Id, 
      CarColor = c.Color, 
      //etc. 
     }); 

有像AutoMapper這樣的工具,但我沒有經驗。

1

假設resultsIEnumerable<CarEntity>

IEnumerable<Car> cars = results.Select(c=> new Car{Brand = c.Brand, Color = c.Color}); 
+0

我想你的意思是IEnumerable? (由於Stack不會讓第三方(輕鬆)編輯錯別字......) – NetMage

+0

是的,謝謝。那裏有一個錯字 –

0
List<Car> cars = results.Select(r=> new Car(){CarId = r.Id, CarColor = r.Color .... etc}}).ToList(); 

results將是你的IEnumerable

0

它實際上是安靜的簡單 讓我們假設您的收藏如下

IEnumerable<Car>=cars; 
IEnumerable<CarEntity>=entities; 
foreach(CarEntity e in entities){ 
     Car c = new Car(e.Id,e.Color,e.Make,e.Model); 
     cars.Add(c); 
} 
0

只是輸入,如果你有實體的很多的,你需要(可能應該)將它們轉換成不同用途的其他邊界對象,我會把那:10那麼你的代碼應該在這樣所有實體運行在實體的擴展類中映射邏輯。

這是爲了不放置對實體的依賴 - 以及可能的其他數據庫或與持久層超出持久層邊界的其他特定依賴關係。 此外,它還爲您提供了一個很好的地方來檢查所有的映射規則 - 易於測試和更改,並且可以製作出很好的上下文特定模型,實現他們所需的上下文,就像這個Car類添加了「馬」到馬力屬性。

我創造出這個這個小例子:

public class CarRepository 
{ 
    private readonly SqlCarStore _carStore; 

    public CarRepository(SqlCarStore carStore) 
    { 
     _carStore = carStore; 
    } 

    public IEnumerable<Car> GetCars() 
    { 
     IEnumerable<CarEntity> dbCars = _carStore.GetCars(); 
     return dbCars.Select(c => c.ToCar()); 

    } 
} 
public static class CarEntityExtensions 
{ 
    //Maps from CarEntity to Car 
    public static Car ToCar(this CarEntity entityCar) 
    { 
     return new Car 
     { 
      Make = entityCar.Make, 
      Model = entityCar.Model, 
      Year = entityCar.Year, 
      HorsePower = entityCar.HorsePower.ToString(), 

     }; 
    } 
} 
public class CarEntity 
{ 
    public string Id { get; set; } 
    public string Make { get; set; } 
    public string Model { get; set; } 
    public string Year { get; set; } 
    public int HorsePower { get; set; } 
} 

public class Car 
{ 
    private string _horsePower; 
    public string Make { get; set; } 
    public string Model { get; set; } 
    public string Year { get; set; } 

    public string HorsePower 
    { 
     get { return _horsePower; } 
     set { _horsePower = $"{value} horses"; } 
    } 
} 
1

另一個LINQ的中心的解決方案,如果你做了很多的CarEntityCar映射是創建一個隱式轉換和使用演員<>:

public static implicit operator Car(CarEntity aCE) { 
    return new Car() { CarId = aCE.Id, CarColor = aCE.Color, 
     CarMake = aCE.Make, CarModel = aCE.Model }; 
} 

然後你可以只是

List<Car> cars = carEntities.Cast<Car>(); 
相關問題