使用连接时跟踪LINQ

时间:2011-02-14 14:03:51

标签: c# linq

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

我正在尝试检查我的LINQ查询最终查找的方式时使用ToTraceString命令。但是,今天我的查询有点复杂,涉及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();

关于如何看到此Join的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());

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

即将编辑

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

public global::System.Data.Objects.ObjectQuery<instructions> instructions

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

2 个答案:

答案 0 :(得分:5)

而不是将您的变量键入IEnumerable<DTODataType>尝试IQueryable<DTODataType>,甚至是var。

我猜测你的查询正在执行,结果存储为IEnumerable,因此无法再将其转换为ObjectQuery

编辑

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

答案 1 :(得分:2)

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

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