如何将这个复杂的实体框架查询转换为标准的SQL查询?具体做什么

本文关键字:查询 SQL 标准 什么 转换 复杂 实体 框架 | 更新日期: 2023-09-27 17:51:12

我没有。net 实体框架的经验,我必须了解到底是什么做这个实体框架查询和翻译在经典SQL (Microsoft SQL server)

所以我有这个查询:

using (MyCorp.EarlyWarnings.Model.EarlyWarningsEntities context = new Model.EarlyWarningsEntities())
            {
                DBContext.SetTimeout(context);
float vulnerabilities_thisweek = (from x in context.VulnerabilityAlertDocuments
                                .Select(p => new { p.Id, p.Published, p.Title, p.Severity, p.LastUpdated })
                                .AsEnumerable()
                                .Select(p => new MyCorp.EarlyWarnings.Model.VulnerabilityAlertDocument()
                                {
                                    Id = p.Id,
                                    Published = p.Published,
                                    Title = p.Title,
                                    Severity = p.Severity,
                                    LastUpdated = p.LastUpdated
                                })
                                .Where(p => p.LastUpdated.Date > DateTime.Now.AddDays(-7).Date)
                                                  select x).Count();
}

我知道这个查询在我的数据库上的结果是-1,00(我知道执行这个查询的信息)

我也知道这个查询在单个表上工作(或者至少我认为是这样,如果我说错了的话是正确的),因为我在上下文中有from x。VulnerabilityAlertDocuments和在EarlyWarningsEntities类中,我发现这个属性映射了名为DbSet对象上名为VulnerabilityAlertDocuments的数据库表VulnerabilityAlertDocument:

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

所以我认为我的SQL查询只能在VulnerabilityAlertDocument数据库表上工作。

我无法理解在其中条件使用=>"操作符"时究竟做了什么,我试图在谷歌上搜索,但我找不到任何

在理解AsEnumerable()方法调用. select()结果时,我也有一些困难。

阅读文档在我看来,第一个。select()方法返回给我一组行,然后它被称为AsEnumerable()方法在这个集合上有一个迭代器,但我不确定,你确认还是错了?

然后它执行第二次选择,我不明白是什么(在我看来,表是相同的)

有人可以帮助我了解到底是什么做这个查询,我如何在标准SQL转换它?

Tnx

如何将这个复杂的实体框架查询转换为标准的SQL查询?具体做什么

您的查询正在创建一个匿名类型只是为了什么,我还没有测试过,但我认为下面的东西会产生相同的结果:

float vulnerabilities_thisweek = (from x in context.VulnerabilityAlertDocuments                                    
                                 .Where(p => p.LastUpdated > DateTime.Now.AddDays(-7))
                                 .Count();
}

我也建议你看看LinqPad,你可以测试你的linq查询,并看到相应的sql语句

对于COUNT查询来说,这似乎过于复杂了。

从我看到的,这可以翻译成:

SELECT COUNT(*) FROM VulnerabilityAlertDocuments WHERE DateDiff(day, LastUpdated,  GetDate()) < 8