我遇到一些关于如何使用实体的问题,例如EF实体和代理类型,它将绑定到UI。
假设我有以下课程
// Db Entity
public class Car
{
public virtual int Id { get; set; }
public string ChassisNumber { get; set; }
public virtual string Brand { get; set; }
public virtual string Name { get; set; }
}
// Surrogate type that reflects some properties of Car entity
// This class will be bound to UI
public class SurrogateCar
{
public string Brand { get; set; }
public string Name { get; set; }
}
现在我将从db获取List<Car>
,并希望创建一个代表我的实体的List<SurrogateCar>
。我可以在很多方面轻松地做到这一点,其中一个是这样的:
List<Car> cars = CarTable.GetMyCars(); // Just a dummy method, suppose it returns all entities from Db.
List<SurrogateCar> surrogates = new List<SurrogateCar>();
foreach (var car in cars)
{
surrogates.Add(new SurrogateCar { Brand = car.Brand, Name = car.Name });
}
或者我可以编写自定义强制转换方法。但我担心的是性能。这种方法会被频繁调用,因此创建一个列表并逐个填充对我来说似乎是一个潜在的问题。
你有更好的方法可以做到这一点,还是可以像这样使用它?
感谢。
答案 0 :(得分:2)
如果您有一个Web服务,并且该服务总是返回SurrogateCar类,那么您可以编写实体查询以返回所需的类,而不是获取您不需要的类:
var cars = from c in context.Cars where {your condition}
select new SurrogateCar
{
Brand=c.Brand,
Name=c.Name
};
另一方面,如果您需要汽车列表,那么Roger指出AutoMapper非常棒!你只需致电
CreateMap<Car, SurrogateCar>
然后您只需使用Automapper填充新列表:
surrogates.AddRange(Map<IEnumberable<Car>, IEnumerable<SurrogateCar>>(cars));
答案 1 :(得分:1)
在你真正测量到这是你的瓶颈之前,不要担心性能!很可能这些不同类型之间的映射并不那么慢。
那里有工具,例如AutoMapper http://automapper.org/ 它的主要目的不是性能,而是潜在地使您更容易编写代码。
答案 2 :(得分:0)
我相信你真正想要的是AutoMapper,它允许围绕这种情况编写无缝,简单的代码。除非你需要担心,否则我不会太担心性能。