通过我的研究,我发现,至少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的“结果视图”功能时,它就会告诉我“无法评估孩子”。这可能是一个单独的问题,但我想如果它有一个共同的原因我会把它包括在内。
答案 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; ...