【发布时间】:2014-04-22 15:00:35
【问题描述】:
通过我的研究,我发现,至少从 EF 4.1 开始,EF 查询上的 .ToString() 方法将返回要运行的 SQL。事实上,这对我来说非常有用,使用 Entity Framework 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 前不久,似乎 没有 的查询向我显示 SQL,但在切换到 EF6 后,它又恢复了正确的行为。 此外,每当我将鼠标悬停在 IQueryable 查询上并尝试使用 IDE 的“结果视图”功能时,它都会告诉我“无法评估儿童”。这可能是一个单独的问题,但我想我会包括它以防它有一个共同的原因。
【问题讨论】:
-
在 EF6 中,您可以通过分配正确的委托将日志记录添加到
DbContext.Database.Log。所有执行的 SQL 都会被记录,包括插入、更新等。 -
我过去也遇到过同样的问题。就我而言,这是因为我不小心在初始
SELECT *查询之上执行了 LINQ-to-objects 查询,因此由于是 LINQ-to-objects,查询的实际对象不同(并且没有 SQL),所以它不存在。最终我发现我做错了什么并修复了我的查询。可能值得您查看有问题的查询和/或它们被分配的类型,以检查您是否不小心执行了部分查询客户端。 -
@martin_costello 我实际上正在查看与问题中的查询几乎相同的查询(仅使用
Entity和Prop的特定域名称)并遇到此问题。由于Where是一个IQueryable 函数并且它的类型为DbQuery,我不确定它是否有任何可能是Linq-to-objects。 -
@EnvisionAndDevelop 好吧,这只是一个想法。也许仔细检查您的
SetOfEntity属性的类型是否正确返回了 'DbSet` 而不是其他东西?我之前也遇到过奇怪的问题,因为属性不是虚拟的,所以 EF 无法正确设置延迟加载功能。 -
@martin_costello 没有敌意,我只是想向其他读者澄清这似乎不是问题。
标签: c# entity-framework entity-framework-5 entity-framework-6