有没有一种方法可以自动将复杂的原始查询映射到实体模型?

时间:2019-07-11 00:00:47

标签: c# entity-framework orm entity-framework-core asp.net-core-2.2

我在ASP.NET Core 2.2框架的顶部有一个使用C#编写的应用程序。该应用程序使用Entity Framework Core作为ORM与数据库进行交互。

在很多情况下,实体框架对我都是有益的。对于简单的CRUD,甚至在添加/更新/删除少量数据时,它都非常有用。

但是,当我需要读取较大的数据集或复杂查询生成的数据时,它太慢了。在许多情况下,我发现实体框架过于复杂,导致我的应用运行缓慢。我猜这是使用ORM的缺点。但是就我而言,ORM必须具有!

考虑到这一点,我正在寻找一种解决方案,在大多数情况下我可以继续使用ORM,但是找到了一种使用自定义查询提取数据并将同一查询直接映射到实体模型的方法。我可以直接使用ADO.NET执行我编写的原始查询,从而提高了性能。但是,我需要一种将请求自动映射到实体模型的方法。

为了解释我要寻找的内容,假设下面的查询实体框架比较复杂,我发现了一个更好的查询来获取相同的数据。这是我更好的原始查询

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 个答案:

答案 0 :(得分:1)

简短的回答是-不(当前)。

它在Raw SQL Queries - Limitations中列出:

  
      
  • SQL查询不能包含相关数据。
  •   

我认为这是因为EF Core通常不使用单个SQL查询来检索相关的集合数据,而是对主数据进行一次查询,对每个相关集合进行一次查询,即对于示例模型,它将使用2个SQL查询

您仍然可以使用原始SQL查询来返回一些平坦的query type的集合,但是随后您必须手动填充实体模型(或借助诸如AutoMapper之类的第三方库)。

答案 1 :(得分:0)

您可以将查询另存为存储过程,并将其带到model.edmx。