Правильная интерпретация запроса SQL от EF Core - PullRequest
1 голос
/ 10 февраля 2020

У меня есть определенная таблица в базе данных, в которой хранятся следующие объекты:

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; }
}

У меня также есть запрос, который возвращает мне количество указанных c элементов:

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

Ответ выглядит примерно так: enter image description here

Как использовать EF, чтобы сделать такой запрос и получить числовой ответ? Я пытался так:

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

но я не получаю ожидаемого результата.

UPD: Получив ответ о невозможности После выполнения этого запроса через EF обоснованно возник следующий вопрос: Можно ли сделать этот запрос с помощью LINQ?

1 Ответ

1 голос
/ 10 февраля 2020

Вы можете использовать ADO.NET через свойство Context.Database. К сожалению, невозможно получить счет из базы данных с помощью методов выполнения 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, поэтому вы должны сделать это на стороне клиента:

проверить эту ссылку: https://docs.microsoft.com/en-us/ef/core/what-is-new/ef-core-3.0/breaking-changes#linq -queries-are-no-Больше-оценивается-на-the -клиент

для 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();
...