[注意答案:我实际上是在查询内存对象,这就是为什么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.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());
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端执行任何数据后处理.
而不是将您的变量键入为IEnumerable<DTODataType>
try IQueryable<DTODataType>
,甚至var.
我在某处猜测你的查询正在执行,结果存储为IEnumerable
,因此不再能够被转换为ObjectQuery
编辑
您能否扩展您的代码片段以显示langDT和langInstructionsAVDT来自哪里?
根据您随后的编辑,很明显您只是在查询和加入内存集合。这就是为什么您不能转换为ObjectQuery
,也是为什么您不能将查询声明为类型 的原因IQueryable<T>
。
换句话说,无法转储正在发出的 SQL,因为没有发出任何 SQL。一旦将数据转换为内存中的 DTO 集合,您就会与数据库断开连接,并且所有查询都变成 linq-to-objects 查询,并且不会生成相应的 T-SQL。