【问题标题】:Is there a way to auto map complicated raw queries to entity models?有没有办法将复杂的原始查询自动映射到实体模型?
【发布时间】:2019-11-20 15:10:17
【问题描述】:

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

Entity Framework 在很多情况下都对我有好处。它在简单的 CRUD 中非常有用,甚至在添加/更新/删除少量数据时也非常有用。

但是,当我需要读取较大的数据集或由复杂查询生成的数据时,速度太慢了。在许多情况下,我发现实体框架过于复杂的查询会导致我的应用程序变慢。我猜这是使用 ORM 的缺点。但是在我的情况下必须有一个 ORM!

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

为了解释我在寻找什么,假设以下查询 Entity Frameworks over complicates 并且我找到了一个更好的查询来获取相同的数据。这是我更好的原始查询

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 对象?

【问题讨论】:

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


    【解决方案1】:

    简短的回答是 - 否(目前)。

    列在Raw SQL Queries - Limitations:

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-03-17
        • 1970-01-01
        • 2012-07-04
        • 1970-01-01
        • 1970-01-01
        • 2022-12-11
        • 1970-01-01
        相关资源
        最近更新 更多