我有一些关于如何与实体一起工作的问题,比如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 });
}或者我可以写一个定制的转换方法。但我担心的是表演。这个方法将经常被调用,所以创建一个列表并一个一个地填充对我来说是一个潜在的问题。
你有什么更好的方法来做这件事,还是可以这样使用它?
谢谢。
发布于 2012-07-11 13:56:58
如果您有一个web服务,并且该服务总是要返回SurrogateCar类,那么您可以编写实体查询来返回您想要的类,而不是获取您不想要的类:
var cars = from c in context.Cars where {your condition}
select new SurrogateCar
{
Brand=c.Brand,
Name=c.Name
};另一方面,如果你总是需要汽车清单,那么正如罗杰所指出的那样,AutoMapper是伟大的!你只要打电话
CreateMap<Car, SurrogateCar>然后,只需使用Automapper来填充新列表:
surrogates.AddRange(Map<IEnumberable<Car>, IEnumerable<SurrogateCar>>(cars));发布于 2012-07-11 13:21:42
不要担心你的表现,直到你真正衡量,这是你的瓶颈!很可能不同类型之间的映射没有那么慢。
还有一些工具(如AutoMapper http://automapper.org/ ),它的主要目的不是性能,而是为了使您编写更容易、更少的代码。
发布于 2012-07-11 13:18:05
我相信您真正想要的是AutoMapper,它允许在这种情况下编写无缝、简单的代码。除非你需要担心,否则我不会太担心演出。
https://stackoverflow.com/questions/11433476
复制相似问题