2011-02-14 60 views
5

[注意事項:在實際查詢內存對象時,這就是爲什麼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側執行任何數據後處理)。

+2

我通常使用LINQPAD來達到這個目的..它有一個很好的功能,可以做到這一點。(點擊結果窗格中的lambda圖標) – 2011-02-14 14:10:34

+0

看到我的編輯 - 需要更多的代碼在您的問題。 – 2011-02-14 15:05:24

+0

看到我的第二個答案。 – 2011-02-14 16:46:12

回答

2

根據您的後續編輯,很明顯,您只需查詢並加入內存集合。這就是爲什麼你不能投到ObjectQuery,這也是爲什麼你不能聲明查詢類型爲IQueryable<T>

換句話說,沒有辦法執行SQL發佈的轉儲,因爲沒有發佈SQL。一旦將數據轉換爲內存中的DTO集合,就會與數據庫斷開連接,並且所有查詢都將成爲linq-to-objects查詢,而不會生成相應的T-SQL。

5

而不是鍵入您的變量作爲IEnumerable<DTODataType>嘗試IQueryable<DTODataType>,甚至變種。

我猜某處有越來越執行您的查詢,結果被存儲爲IEnumerable,因此不再能夠被轉換爲ObjectQuery

編輯

能否請你展開你的代碼段顯示langDTs和langInstructionsAVDTs來自哪裏?