Есть ли способ автоматически сопоставлять сложные необработанные запросы с моделями сущностей? - PullRequest
1 голос
/ 11 июля 2019

У меня есть приложение, написанное с использованием C# поверх ASP.NET Core 2.2 Framework.Приложение использует Entity Framework Core в качестве ORM для взаимодействия с базой данных.

Entity Framework был полезен для меня во многих случаях.Это очень полезно при простом CRUD или даже при добавлении / обновлении / удалении небольшого объема данных.

Однако, когда мне нужно прочитать несколько больших наборов данных или данных, сгенерированных сложным запросом, это слишком медленно.Во многих случаях я нахожу Entity Framework более сложными запросами, которые приводят к замедлению работы моего приложения.Я предполагаю, что это недостаток использования ORM.Но ORM это должно быть в моем случае!

Имея это в виду, я ищу решение, в котором я могу продолжать использовать ORM в большинстве случаев, но найти способ извлечения данных с помощью пользовательского запроса и непосредственного сопоставления того же запроса с моделями сущностей.Я могу напрямую использовать ADO.NET для выполнения необработанных запросов, которые я пишу, что дает мне высокую производительность.Но мне нужен способ автоматического сопоставления запросов с моделями сущностей.

Для объяснения того, что я ищу, предположим, что следующий запрос Entity Frameworks усложняет, и я нашел лучший запрос для получения того жеданные.Вот мой лучший необработанный запрос

SELECT u.username, u.firstname, u.lastname, p.*
FROM users AS u
INNER JOIN (
   SELECT id, title, description, userid
   FROM posts
   WHERE deletedon IS NULL AND publishedon BETWEEN '2019-07-01' AND '2019-07-10'
) AS p
WHERE u.deletedon IS NULL

У меня есть следующая модель сущности

public class User 
{
  public int id { get ; set; }
  public string username { get ; set; }
  public string firstname { get ; set; }
  public string lastname { get ; set; }
  public DateTime deletedon { get ; set; }

  public virtual ICollection<Post> posts { get ; set; }
}

public class Post 
{
  public int id { get ; set; }
  public string title{ get ; set; }
  public string description { get ; set; }
  public int userId { get ; set; }
  public DateTime deletedon { get ; set; }
  public DateTime publishedon { get ; set; }

  public virtual User user { get ; set; }
}

Существует ли инструмент, который может принять запрос или объект таблицы данных и отобразить его намой User объект?

Ответы [ 2 ]

1 голос
/ 11 июля 2019

Краткий ответ - нет (в настоящее время).

Он указан в Необработанные SQL-запросы - Ограничения :

  • SQL-запрос не можетсодержат связанные данные.

Я полагаю, это связано с тем, что EF Core в целом не использует один SQL-запрос для извлечения коррелированных данных коллекции, а один запрос для основных данных и один запрос для каждой связаннойколлекции, т. е. для образца модели будет использоваться 2 SQL-запроса.

Вы все еще можете использовать необработанные SQL-запросы для возврата наборов некоторого плоского типа запроса , но тогда вам нужно заполнить модели сущностей.вручную (или с помощью сторонних библиотек, таких как AutoMapper).

0 голосов
/ 11 июля 2019

Вы можете сохранить запрос как хранимую процедуру и перенести его в файл model.edmx.

...