来自JS / PHP / Node背景,对C#app dev来说有点新鲜。使用MVC应用程序。
我需要从我的服务中将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 :(得分: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
}
);
答案 1 :(得分:2)
漫长的方法是使用LINQ的IEnumerable<T>
.Select扩展方法IEnumberable<CarEntity> carEntities = repository.GetCars();
IEnumerable<Car> cars =
carEntities
.Select(c =>
new Car
{
CarId = c.Id,
CarColor = c.Color,
//etc.
});
到project将一个集合中的项目改为另一个集合:
#open file with DNA strand
df = open('dnafile.txt','r')
#function for finding complementary strand
def encode(code,DNA):
for k in code:
DNA = DNA.replace(k,code[k])
print('The complementary strand is: ' + DNA)
#carrying out function
code = {ord('A'):'T', ord('T'):'A', ord('G'):'C', ord('C'):'G'}
DNA = df.read()
encode(code,DNA)
那里有像AutoMapper这样的工具,但我对它们没有经验。
答案 2 :(得分:1)
假设results
为IEnumerable<CarEntity>
:
IEnumerable<Car> cars = results.Select(c=> new Car{Brand = c.Brand, Color = c.Color});
答案 3 :(得分:1)
如果您执行大量CarEntity
到Car
映射,另一个以Linq为中心的解决方案是创建隐式转换并使用Cast&lt;&gt;:
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>();
答案 4 :(得分:0)
List<Car> cars = results.Select(r=> new Car(){CarId = r.Id, CarColor = r.Color .... etc}}).ToList();
results
将是您的IEnumerable
答案 5 :(得分: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);
}
答案 6 :(得分:0)
只是输入,如果你有很多实体并且你需要(可能应该)将它们转换为其他边界对象以用于不同用途,我会将该映射逻辑放在实体的扩展类中。
这不是依赖于实体 - 以及与持久性层边界之外的持久性相关的其他可能的其他数据库或其他特定依赖项。 此外,它还为您提供了一个检查所有映射规则的好地方 - 易于测试和更改,并且您可以制作好的上下文特定模型来实现他们的上下文所需的内容,例如将“horse”这个词添加到“car”中的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"; }
}
}