[注意事項:在實際查詢內存對象時,這就是爲什麼ToTraceString
不起作用。爲了節省閱讀我長篇文章的讀者潛在時間,我添加了這個]。使用連接時跟蹤LINQ
我在使用ToTraceString
命令試圖檢查我的LINQ查詢如何最終查找。但是,今天我的查詢有點複雜,涉及到join
,突然間,當我嘗試跟蹤我的字符串時出現此錯誤:
無法投射類型爲'd__7a`1的對象[EGSLanguageProviderShared.DTODataType] '鍵入'System.Data.Objects.ObjectQuery'。
我的查詢和後續調用ToTraceString
如下所示(請注意System.Data.Entity必須被引用才能使其工作)。我查詢的兩個對象(langDTs和langInstructionsAVDTs)都來自同一個數據庫的實體框架(.Net 3.5)對象。我的Where子句(== av.InstructionAVKey)使用一個簡單的值集合類,沒有什麼可以在那裏看到的。
IEnumerable<DTODataType> dts =
(from langDT in langDTs
join langIAVDT in langInstructionsAVDTs
on langDT.DataTypeKey equals langIAVDT.DataTypeKey
where langIAVDT.InstructionAVKey == av.InstructionAVKey
select langDT).Distinct();
var sql = ((System.Data.Objects.ObjectQuery)dts).ToTraceString();
關於如何查看LINQ翻譯此加入的任何想法? :: - )。我注意到System.Data.Objects有更多類型的查詢,但我無法得到任何似乎與這種情況更相關的工作。
以後編輯:
正如你建議,我試圖改變了IEnumerable爲IQueryable但導致了類型不兼容編譯錯誤:: - /。
做一個明確的轉換後,我得到了同樣的錯誤,但在運行時(Unable to cast object of type '<DistinctIterator>d__7a1[EGSLanguageProviderShared.DTODataType]' to type 'System.Linq.IQueryable
1 EGSLanguageProviderShared.DTODataType]」`)
附加代碼:我的對象langDTs和langInstructionsAVDTs是:
List<DTOInstructionActiveValueDataType> langInstructionsAVDTs = CurrentLPInstructionManager.GetInstructionsActiveValuesDataTypes((from avKey in langInstructionsAVs select avKey.InstructionAVKey).Distinct().ToArray());
List<DTODataType> langDTs = _LPDataTypeManager.GetDataTypes((from dt in langInstructionsAVDTs orderby dt.DataTypeKey select dt.DataTypeKey).Distinct().ToArray());
因此,這些對象的確被立即查詢,因爲它們是Lists :: - )。至於DTODataType和DTOInstructionActiveValueDataType,它們是簡單的值集合類,就是公共屬性,就這些。
甚至更晚EDIT
可能是,在他們的根,我使用的對象確實聲明的ObjectQuery早在最深的一層(實體框架)利息:
public global::System.Data.Objects.ObjectQuery<instructions> instructions
但是,當我從數據訪問層傳輸數據時,我將它們轉換爲數據傳輸對象(您繼續看到的DTO前綴類),它們是簡單的值集合類(實體的屬性 - 屬性映射我爲了保持數據模型與數據模型完全分離而使用的對象e View並且還可以在Presentation側執行任何數據後處理)。
我通常使用LINQPAD來達到這個目的..它有一個很好的功能,可以做到這一點。(點擊結果窗格中的lambda圖標) – 2011-02-14 14:10:34
看到我的編輯 - 需要更多的代碼在您的問題。 – 2011-02-14 15:05:24
看到我的第二個答案。 – 2011-02-14 16:46:12