EF Core 对 SQL 请求的正确解释

Correct interpretation of SQL request by EF Core

我在数据库中有一个table存储以下对象:

public partial class Invoice
{
    public string DocumentNumber { get; set; }
    public DateTime? DocumentDate { get; set; }
    public string DocumentReference { get; set; }
    public string SerialNumber { get; set; }
    public string ProductCode { get; set; }
    public string Description { get; set; }
    public string Certificate { get; set; }
    public string Language { get; set; }
    public string Email { get; set; }
}

我也有一个查询returns我的具体元素的数量:

SELECT Count(*)
        FROM (
                SELECT DocumentNumber,DocumentDate,DocumentReference
                FROM vInvoiceSwivelInfoWeb
                WHERE Email = 'someemail@gmail.com' AND Language = 'FR'
                GROUP BY DocumentNumber,DocumentDate,DocumentReference
            ) AS T

答案看起来像这样:

如何使用EF发出这样的请求并得到一个数字的答案? 我试过这样:

_context.Database.ExecuteSqlRawAsync($"..some SQL query..")

但我没有得到预期的结果。

UPD: 收到关于无法通过 EF 完成此请求的答复后,合理地提出了以下问题:是否可以使用LINQ?

您可以通过 Context.Database 属性 利用 ADO.NET。 遗憾的是,如果您有与您的实体无关的自定义查询,则无法使用 EF Core 执行方法从数据库中获取计数。

using (var command = context.Database.GetDbConnection().CreateCommand())
{
    command.CommandText = "SELECT Count(*) From Table1";
    context.Database.OpenConnection();
    using (var result = command.ExecuteReader())
    {
        // do something with result
    }
}

更新问题

    var count = from a in _context.vInvoiceSwivelInfoWeb
                where a.Email == "someemail@gmail.com" && a.Language == "FR"
                group new { a.DocumentNumber , a.DocumentReference , a.DocumentDate } by a into g
                select g.Count()

此外,了解您使用的是哪个版本的 EF-Core 也很重要: 目前,如果您使用的是 EF-Core 3,group-by 不会转换为 SQL 命令,因此您必须在客户端执行此操作:

检查此 link: https://docs.microsoft.com/en-us/ef/core/what-is-new/ef-core-3.0/breaking-changes#linq-queries-are-no-longer-evaluated-on-the-client

对于 EF-Core 3.0 - 3.1.1

var count = _context.vInvoiceSwivelInfoWeb
                 .Where(a => a.Email == "someemail@gmail.com" && a.Language == "FR" ).ToList()
                 .GroupBy(a => new { a.DocumentNumber ,a.DocumentDate, a.DocumentReference }).Count();