2012-07-11 46 views
2

我有一些關於如何與一個實體一起工作的問題說EF實體和代理類型,這將綁定到用戶界面。實體和它的代理類型之間的轉換

假設我有以下類

// 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>,並希望創建一個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 }); 
     } 

或者我可以寫一個自定義的投射方法。但我擔心的是表演。這個方法會被頻繁調用,所以創建一個列表並且逐個填充它對我來說似乎是一個潛在的問題。

你有沒有更好的方法來做到這一點,或者是否可以像這樣使用它?

謝謝。

+1

無論方法,你拿名單必須被迭代,然後代孕已經被實例化......那是必然的 – Chandu 2012-07-11 13:17:53

+0

@Chandu,其實這就是爲什麼我要求瞭解是否有辦法避免它。謝謝。 – 2012-07-11 13:22:22

回答

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)); 
+0

我不知道你爲什麼提到web服務,但你的查詢是我正在尋找的。 – 2012-07-12 06:28:29

1

不用擔心性能,直到你真的測量過這是你的瓶頸!很可能這些不同類型之間的映射並不那麼慢。

這裏有工具,例如AutoMapper http://automapper.org/ 它的主要目的不在於性能,而是爲了讓你寫出更容易,更少的代碼。

相關問題