如何将这个简单的Entity Framework查询转换为标准SQL查询?

时间:2014-03-21 12:52:38

标签: c# .net sql-server entity-framework entity-framework-4

我没有使用.NET 实体框架的经验,我对这个查询到底做了什么有疑问:

using (MyCorpo.EarlyWarnings.Model.EarlyWarningsEntities context = new Model.EarlyWarningsEntities()) 
{
    DBContext.SetTimeout(context);    

    model.VulnerabilitySeverityAverage = (from x in context.VulnerabilityAlertDocuments select x.Severity).Average();
}

(model.VulnerabilitySeverityAverage的类型只是一个字符串)

所以我认为 VulnerabilityAlertDocuments 会映射 VulnerabilityAlertDocument数据库表,因为在 EarlyWarningsEntities 中我有这样的内容:

public DbSet<VulnerabilityAlertDocument> VulnerabilityAlertDocuments { get; set; }

所以我正在对 VulnerabilityAlertDocuments DbSet对象执行查询,该对象代表我数据库上 VulnerabilityAlertDocument 表的查询。这是对的吗?

那么以前的查询是什么?

我认为它会选择 VulnerabilityAlertDocument 表中所有记录的严重性字段值,并根据所有这些值计算avarage值。

我的推理是否正确?

如何在经典SQL查询中转换此实体查询?有人可以帮帮我吗?

TNX

2 个答案:

答案 0 :(得分:1)

  

如何在经典SQL查询中转换此实体查询?

要查看实际的SQL,您只需在查询中调用.ToString()方法;

var sql = (from x in context.VulnerabilityAlertDocuments select x.Severity).Average().ToString();
  

所以我正在对VulnerabilityAlertDocuments DbSet执行查询   表示我的VulnerabilityAlertDocument表上的查询的对象   在我的数据库上。这是对的吗?

So what exatly do the previous query?

您的查询将在ValnerabilityAlertDocuments表的Severity列中显示平均值。 您翻译的查询看起来与此类似:

SELECT 
[GroupBy1].[A1] AS [C1]
FROM ( SELECT 
    AVG([Extent1].[Severity]) AS [A1]
    FROM [dbo].[ValnerabilityAlertDocuments] AS [Extent1]
)  AS [GroupBy1]

您也可以尝试使用SQL Server Profiler

等工具

更新: 只需将LinqPad添加到工具列表中(感谢Dismissile)

答案 1 :(得分:0)

Select Average(x.Severity)
From VulnerabilityAlertDocuments x

假设您的表名为“VulnerabilityAlertDocuments”

再试一次