Я работаю над небольшим проектом ASP.NET Core для пометки изображений с использованием Entity Framework Core в базе данных Sqlite, в основном только для обучения. Есть две таблицы (и POCO), Теги и Изображения, где несколько тегов связаны с каждым изображением. Я пытаюсь подсчитать все изображения, с которыми связаны теги.
В простом SQL я бы написал SELECT COUNT(DISTINCT ImageId) FROM Tags, чтобы получить количество, а в LINQ я придумал _context.Tags.Select(t => t.Image).Distinct().Count(). Но этот запрос LINQ заставляет EF-Core объединять две таблицы, возвращать все строки, а затем выполнять Distinct и Count в коде.
Я пытался сделать _context.Tags.FromSql("SELECT COUNT(DISTINCT ImageId) FROM Tags"), но поскольку этот запрос возвращает только счетчик, вызов завершается ошибкой, потому что EF не может сопоставить результат с тегом. Я также пытался использовать _context.Database.FromSql<int>, но не смог найти никакой реальной документации по нему и, похоже, для него не существует IntelliSense.
На данный момент я сделал то, что подробно описано в разделе «ADO.NET» этого запись в блоге от Эрика Андерсона:
int count;
using (var connection = _context.Database.GetDbConnection())
{
connection.Open();
using (var command = connection.CreateCommand())
{
command.CommandText = "SELECT COUNT(DISTINCT ImageId) FROM Tags";
string result = command.ExecuteScalar().ToString();
int.TryParse(result, out count);
}
}
Но лучший ли это способ добиться эффективного подсчета?
Изменить: вот запрос, который EF помещает в вывод отладки:
SELECT "t"."TagId", "t"."Content", "t"."ImageId", "t.Image"."ImageId", "t.Image"."FileName", "t.Image"."Path", "t.Image"."Url"
FROM "Tags" AS "t"
LEFT JOIN "Images" AS "t.Image" ON "t"."ImageId" = "t.Image"."ImageId"
ORDER BY "t"."ImageId"