2

我在如何使用实体时遇到一些问题,比如 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; }
    }

现在我List<Car>将从 db 获取并希望创建一个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 });
      }

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

你有没有更好的方法来做到这一点,或者像这样使用它可以吗?

谢谢。

4

3 回答 3

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));
于 2012-07-11T13:56:58.127 回答
1

在你真正测量出这是你的瓶颈之前,不要担心性能!很可能这些不同类型之间的映射并没有那么慢。

那里有一些工具,例如 AutoMapper http://automapper.org/ 它的主要目的不是性能,而是潜在地使您编写更容易和更少的代码。

于 2012-07-11T13:21:42.923 回答
0

我相信您真正在寻找的是AutoMapper,它允许围绕这种情况编写无缝、简单的代码。除非您需要担心,否则我不会太担心性能。

这是关于使用自动映射器映射列表的 SO

于 2012-07-11T13:18:05.663 回答