【问题标题】:Entity Framework query ToString won't produce SQL query实体框架查询 ToString 不会产生 SQL 查询
【发布时间】: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&lt;Namespace.Entity&gt; 而不是 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 我实际上正在查看与问题中的查询几乎相同的查询(仅使用EntityProp 的特定域名称)并遇到此问题。由于Where 是一个IQueryable 函数并且它的类型为DbQuery,我不确定它是否有任何可能是Linq-to-objects。
  • @EnvisionAndDevelop 好吧,这只是一个想法。也许仔细检查您的 SetOfEntity 属性的类型是否正确返回了 'DbSet` 而不是其他东西?我之前也遇到过奇怪的问题,因为属性不是虚拟的,所以 EF 无法正确设置延迟加载功能。
  • @martin_costello 没有敌意,我只是想向其他读者澄清这似乎不是问题。

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


【解决方案1】:

如果在对数据库执行 SQL 之前不需要 SQL,则可以执行以下操作:

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

这会将 SQL(和一些附加数据)打印到调试输出中。
详情见以下链接:http://msdn.microsoft.com/de-DE/data/dn469464

按照 martin_costello 的建议,在尝试通过 ToString() 获取 SQL 之前,请检查您是否没有查询数据库。它也发生在我身上,我已经得到了对象,因为使用了IEnumerable&lt;&gt;“to early”(而不是IQueryable&lt;&gt;),所以从数据库中获取了许多实体并做了一些过滤“代码”而不是“在 SQL 中"...

【讨论】:

  • 这确实解决了我对检索已运行的 SQL 的担忧,尽管我更喜欢修复问题而不是其症状的 SQL。不幸的是,我们已经将 Database.Log 用于特殊的错误处理功能,因此这也不会比简单地运行跟踪容易得多。在我接受这个之前,我会再等一会儿以获得更多答案。
猜你喜欢
  • 2012-03-09
  • 1970-01-01
  • 2014-01-25
  • 1970-01-01
  • 2012-10-26
  • 2012-08-03
  • 2021-03-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多