在实体和它的代理类型之间转换

时间:2012-07-11 13:12:50

标签: c# entity-framework casting

我遇到一些关于如何使用实体的问题,例如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 });
      }

或者我可以编写自定义强制转换方法。但我担心的是性能。这种方法会被频繁调用,因此创建一个列表并逐个填充对我来说似乎是一个潜在的问题。

你有更好的方法可以做到这一点,还是可以像这样使用它?

感谢。

3 个答案:

答案 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,它允许围绕这种情况编写无缝,简单的代码。除非你需要担心,否则我不会太担心性能。

Here is a SO about mapping lists using automapper, also