2011-09-27 66 views
4

我不斷遇到一種模式,我希望從實體集合(EF4)中選擇行並使用這些數據在不同實體集合中創建新行。是否有必要每次都選擇()... new {Anon} ... AsEnumerable ... Select(new EntityType {})?

我發現做到這一點的唯一方法是執行以下步驟:

var newEntities = (from e in myentities 
    where e.x == y 
    select new { 
    Prop1 = e.Prop1, 
    Prop2 = e.Prop2+e.Prop3, 
    Prop3 = DateTime.Now, 
    Prop4 = "Hardcodedstring"} 
) 
    .AsEnumerable() 
    .Select(n=>new OtherEntity{ 
    Prop1 = n.Prop1, 
    Prop2 = n.Prop2, 
    Prop3 = n.Prop3, 
    Prop4 = n.Prop4} 
); 

//insert into database and save 

如果我嘗試創建在選擇一個新的OtherEntity然後我得到的EF例外。

這是繼續進行的唯一方法嗎?使整個事情非常繁瑣,似乎完全浪費擊鍵?

回答

0

我喜歡這個解決方案是創建一個Convertor類,這需要Source參數(無論是列表或單個對象),並將其傳輸(創建新實例,並賦值給它)到destination class type

List<OtherEntity> lst = Convertor.ConvertToOtherEntity(newEntities); 
+0

我想我會使用某種轉換器只是爲了保持代碼更清晰和更具可讀性。 – BlueChippy

1

我建議使用Automapper從您的實體映射到您的域對象,而不是從linq查詢中進行映射。

+0

這是爲了從實體映射到實體而不是實體到域到實體。我使用automapper爲實體viewmodel。 – BlueChippy

1

不,這是唯一的方法。 在運行AsEnumerable,ToList等之前,您可以調用的唯一方法是由Entity Framework映射到SQL語法的方法。 因爲OtherEntity的構造函數沒有映射到任何東西,所以在Entity上下文中調用它是不可能的。

相關問題