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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何将这个简单的Entity Framework查询转换为标准SQL查询?相关的知识,希望对你有一定的参考价值。

我没有使用.NET Entity Framework的经验,并且对此查询的确切用途有疑问:

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

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

(模型的类型。VulnerabilitySeverityAverage只是一个字符串)

所以我认为VulnerabilityAlertDocuments映射VulnerabilityAlertDocument数据库表,因为进入EarlyWarningsEntities,我有这行内容:

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

因此,我正在对VulnerabilityAlertDocuments DbSet对象执行查询,该对象代表对数据库上的VulnerabilityAlertDocument表的查询。正确吗?

那么上一个查询到底做了什么?

我认为它选择VulnerabilityAlertDocument表中所有记录的Severity字段值,并根据所有这些值计算平均值。

我的推理正确吗?

如何在传统的SQL查询中转换该实体查询?有人可以帮助我吗?

Tnx

答案
如何在传统的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表的“严重性”列中的平均值。您的翻译查询看起来与此类似:

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

也可以尝试使用SQL Server Profiler等工具>

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

另一答案
Select Average(x.Severity) From VulnerabilityAlertDocuments x

以上是关于如何将这个简单的Entity Framework查询转换为标准SQL查询?的主要内容,如果未能解决你的问题,请参考以下文章

Entity Framework Core:如何将 2 个 COUNT 查询合并为一个

如何在 Entity Framework Group By 结果中包含属性

Entity Framework Core 性能优化

Entity Framework Core 性能优化

Entity Framework的基本操作

Entity Framework Core 性能优化