使用连接时跟踪LINQ

Axo*_*onn 5 c# linq

[注意答案:我实际上是在查询内存对象,这就是为什么ToTraceString不起作用.我添加了这个以节省阅读器阅读我的长篇文章的潜在时间].

ToTraceString试图检查我的LINQ查询最终看起来如何使用命令.但是,今天我的查询有点复杂,涉及到join一切突然,当我尝试跟踪我的字符串时,我收到此错误:

无法将类型为'd__7a`1 [EGSLanguageProviderShared.DTODataType]'的对象强制转换为'System.Data.Objects.ObjectQuery'.

我的查询和后续调用ToTraceString如下(请注意,必须引用System.Data.Entity才能使其工作).我正在查询的两个对象(langDT和langInstructionsAVDT)是来自同一数据库的实体框架(.Net 3.5)对象.我的Where子句(== av.InstructionAVKey)使用一个简单的Value Collection Class,没有什么可看的.

      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();
Run Code Online (Sandbox Code Playgroud)

关于如何看到这个Join的LINQ翻译的任何想法?:: - ).我注意到System.Data.Objects有更多类型的查询,但是我无法得到任何与这种情况更相关的查询.

后期编辑:

正如您所建议的那样,我尝试将IEnumerable更改为IQueryable,但这导致了类型不兼容编译错误:: - /.

在进行显式转换后,我得到了相同的错误,但在运行时(Unable to cast object of type '<DistinctIterator>d__7a1[EGSLanguageProviderShared.DTODataType]' to type 'System.Linq.IQueryable1 [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());
Run Code Online (Sandbox Code Playgroud)

所以这些对象确实立即被查询,因为它们是列表:: - ).至于DTODataType和DTOInstructionActiveValueDataType,它们是简单的Value Collection Classes,只是公共属性,就是全部.

即便编辑

可能有兴趣从根本上说,我正在使用的对象确实在最深层(Entity Framework)中被声明为ObjectQuery:

public global::System.Data.Objects.ObjectQuery<instructions> instructions
Run Code Online (Sandbox Code Playgroud)

但是,当我从数据访问层引入数据时,我将它们转换为数据传输对象(您一直看到的DTO前缀类),它们是简单的值集合类(实体的属性属性映射)我使用的对象是为了使数据模型与View完全分离,并在Presentation端执行任何数据后处理.

Ada*_*kis 5

而不是将您的变量键入为IEnumerable<DTODataType>try IQueryable<DTODataType>,甚至var.

我在某处猜测你的查询正在执行,结果存储为IEnumerable,因此不再能够被转换为ObjectQuery

编辑

您能否扩展您的代码片段以显示langDT和langInstructionsAVDT来自哪里?


Ada*_*kis 2

根据您随后的编辑,很明显您只是在查询和加入内存集合。这就是为什么您不能转换为ObjectQuery,也是为什么您不能将查询声明为类型 的原因IQueryable<T>

换句话说,无法转储正在发出的 SQL,因为没有发出任何 SQL。一旦将数据转换为内存中的 DTO 集合,您就会与数据库断开连接,并且所有查询都变成 linq-to-objects 查询,并且不会生成相应的 T-SQL。