2016-09-28 156 views
-1

我使用的EntityFramework從數據庫對象的列表,我使用匿名類型,最終返回正確的對象創建對象。因爲有幾個函數需要做這個'匿名類型轉換'我想提取這個函數。從匿名類型

我可以創建一個函數來創建一個動態的,而是因爲如果函數包含動態參數,返回類型是一個動態類型也不能創建轉換一個動態的在特定類型的函數。

這工作:

List<SomeObject> list = list 
      .Select(i => GetAnonymousType(i)) 
      .Select(i => new SomeObject {Item1 = i.Item1, Item2 =i.Item2}).ToList(); 

這不:

List<SomeObject> list = list 
     .Select(i => GetAnonymousType(i)) 
     .Select(i => CreateSomeObjectFromDynamic(i)).ToList(); 

private static SomeObject CreateSomeObjectFromDynamic(dynamic i) 
{ 
    return new SomeObject {Item1 = i.Item1, Item2 = i.Item2}; 
} 

參見:https://dotnetfiddle.net/zLFlur

有沒有一種方法,我可以使用的功能,如:CreateSomeObjectFromDynamic返回正確的類型?

+0

我想你已經問題遇到的問題是EF無法將'CreateSomeObjectFromDynamic'轉換爲SQL。據我所知,解決這個問題的唯一方法就是記憶。執行你的查詢,然後執行'CreateSomeObjectFromDynamic'方法。這樣,您需要定義一個選擇反正明顯的缺點.. :( – smoksnes

+0

即使這是平移,以SQL中的問題是,你試圖從*編譯* - 時間,你在提供運行*。*這億韓元使用時間一點都不工作,你可以用反射來實現這個功能,但是你仍然不能獲得編譯時類型,因此你的'Select'永遠不會被強類型化 - 我懷疑它甚至是可能的(或者是否存在非一般的選擇?)。 – HimBromBeere

+0

鑄造動態的一個對象的創建,然後使用反射一個新SomeObject的作品。我不知道我是否會去那個意志。我更好地複製代碼,以動態轉換爲SomeObject在需要它 –

回答

0

試試這個:

 list = list 
    .Select(i => GetAnonymousType(i)) 
    .Select(i => CreateSomeObjectFromDynamic(i) as SomeObject).ToList(); 
+0

這麼簡單!謝謝! –

0

根據提供的代碼fiddle,你的問題不是CreateSomeObjectFromDynamic方法,你的問題是用GetAnonymousType方法。此方法返回dynamic和.NET無法處理它。該compliler錯誤說:

無法隱式轉換類型 'System.Collections.Generic.List < dynamic>來 'System.Collections.Generic.List < SomeObject>'

即使更改查詢爲

list = list 
     .Select(i => CreateSomeObjectFromDynamic(GetAnonymousType(i))) 
     .ToList(); 

將產生相同的錯誤。但是,如果你改變GetAnonymousType方法的返回類型object如下:

private static object GetAnonymousType(SomeObject i) 
{ 
    return new { Item1 = i.Item1, Item2 = i.Item2 }; 
} 

您的問題將得到解決。但是,這在內存中起作用,例如,如果您嘗試將其與IQueryable配合使用,我不確定它會成功轉換爲SQL。另外,我不推薦使用dynamic,儘管它在將返回類型設置爲object後工作,但您的代碼看起來不正確。如果你做一點努力,我相信你會找到另一種方式,例如使用繼承仿製藥

+0

如果我使用反射在GetAnonymousType創建SomeObject這隻有每個功能。 –

+1

@MarcelHoekstra,我不知道你的意思,但是從搗鼓複製你的代碼,只需chagne'GetAnonymousType'到'object',取消註釋行的返回類型,它會工作 –