实体框架查询ToString不会产生SQL查询

时间:2014-04-22 15:00:36

标签: c# entity-framework entity-framework-5 entity-framework-6

通过我的研究,我发现,至少EF 4.1,EF查询中的.ToString()方法将返回要运行的SQL。实际上,这经常适用于我,使用实体框架5和6。

但是,偶尔我会调用此方法并获取查询对象的运行时类型。 这是我的具体例子:

Entity input = ...;
IQueryable<Entity> query = dbContext.SetOfEntity.Where(e => e.Prop == input.Prop);

更具体地说,我在VS2013中设置断点并将鼠标悬停在查询对象上,并看到System.Data.Entity.Infrastructure.DbQuery<Namespace.Entity>而不是SQL来运行该查询。有趣的是,如果我将鼠标悬停在DBSet属性(dbContext.SetOfEntity)上,我执行会查看关联表的基本选择SQL。只有在我过滤结果时才会丢失SQL。

显然,这是一个非常简单的查询,我可以自己编写SQL,但是这个问题发生在更复杂的查询上,能够调试发送到服务器的SQL而不运行会很好数据库跟踪。

一些背景

前段时间,我正在使用EF5,而ToString()似乎有效。在切换到EF6之前不久,查询的 none 似乎显示了SQL,但在切换到EF6之后,它又恢复了正确的行为。 此外,每当我将鼠标悬停在IQueryable查询上并尝试使用IDE的“结果视图”功能时,它就会告诉我“无法评估孩子”。这可能是一个单独的问题,但我想如果它有一个共同的原因我会把它包括在内。

1 个答案:

答案 0 :(得分:3)

如果您不需要SQL BEFORE,它可以执行以下操作:

dbContext.Database.Log = s => Debug.WriteLine(s);

这会将SQL(和一些其他数据)打印到调试输出 有关详细信息,请参阅以下链接:http://msdn.microsoft.com/de-DE/data/dn469464

同样检查,正如martin_costello建议的那样,在尝试通过ToString()获取SQL之前,您没有查询数据库。它也发生在我身上,我已经有了对象,因为使用IEnumerable<>&#34;早期&#34; (相反,如果IQueryable<>),那么从数据库中获取许多实体,并在代码中进行一些过滤&#34;&#34;而不是&#34;在SQL&#34; ...