【问题标题】:Is a custom class required for raw SQL queries in the Entity Framework?实体框架中的原始 SQL 查询是否需要自定义类?
【发布时间】:2017-01-05 17:33:03
【问题描述】:

我对某事感到困惑。我了解 ORM 在做什么,也了解 EF 是什么。我模糊的是我不想使用专门的构造来获取数据的部分。我想使用 SQL。如果我在 SQL 中创建一个复杂的查询、大量的子查询等等,我是否更正了,如果我希望能够像处理属性一样处理数据,我必须为该查询创建一个特殊的自定义类。

我正在考虑这样的场景。有人需要信息。它需要一个复杂的查询,从 5 个不同的表中返回 20 列。我需要创建一个包含这些列的类,然后编写查询。这是正确的吗?

我正在看这个教程,

https://www.asp.net/mvc/overview/getting-started/getting-started-with-ef-using-mvc/creating-an-entity-framework-data-model-for-an-asp-net-mvc-application

using System;
using System.Collections.Generic;

namespace ContosoUniversity.Models
{
    public class Student
    {
        public int ID { get; set; }
        public string LastName { get; set; }
        public string FirstMidName { get; set; }
        public DateTime EnrollmentDate { get; set; }

        public virtual ICollection<Enrollment> Enrollments { get; set; }
    }
}

如果这类似于 Moodle 或其他 LMS 或学生信息系统会怎样?它们变得复杂,并且需要来自多个表的大量联接和数据。

这个会不会重复很多:

public virtual ICollection<Enrollment> Enrollments { get; set; }
public virtual ICollection<Schedule> Schedules{ get; set; }
public virtual ICollection<SubjectContext> SubjectContexts{ get; set; }
public virtual ICollection<Grade> Grades{ get; set; }
public virtual ICollection<Instructor> Instructors{ get; set; }

例如,考虑这个查询:

SELECT user.firstname, user.lastname, user.email, user.country, cc.name AS 'course category name', c.fullname, q.name, question.content AS 'Question', choice.content AS 'Question option', choicerank.rank AS 'Choice value'
FROM mdl_course_categories AS cc
INNER JOIN mdl_course AS c ON c.category = cc.id
INNER JOIN mdl_questionnaire AS q ON q.course = c.id
INNER JOIN mdl_questionnaire_question AS question ON question.survey_id = q.id
INNER JOIN mdl_questionnaire_quest_choice AS choice ON choice.question_id = question.id
INNER JOIN mdl_questionnaire_response_rank AS choicerank ON choicerank.choice_id = choice.id
JOIN mdl_context AS ctx ON c.id = ctx.instanceid
JOIN mdl_role_assignments AS ra ON ra.contextid = ctx.id
JOIN mdl_user AS user ON user.id = ra.userid
ORDER BY user.firstname

这需要自定义类吗?

如果我做的事情有.toList(String),这是否违背了使用框架的初衷?

【问题讨论】:

  • 原始 SQL 或 LINQ 查询,您需要一个类来表示查询结果。
  • 所以我明白了。请。除了 SQL 本身之外,我可能还需要构建许多部分,对吗?换句话说,我需要检查我有多少查询,判断它们的复杂性等,看看我是否从 ORM 中受益。

标签: entity-framework rawsql


【解决方案1】:

在这种情况下,ORM 会带来什么好处?真正的问题。我想不出一个。

使用QueryFirst。您在最佳条件下(sql 窗口)编辑您的 SQL,并且您没有其他东西可以构建

免责声明:我写的是 QueryFirst。

【讨论】:

  • 我不明白。我以为 EF 也生成了类。
  • EF 将为您的 模式对象 生成类。如果您编写他们不希望您执行的“自定义 sql”,您可以编写和维护将接收结果的类,如果它们不对齐,那就是运行时错误。
猜你喜欢
  • 1970-01-01
  • 2021-03-02
  • 2016-05-20
  • 2015-06-16
  • 1970-01-01
  • 2013-03-08
  • 1970-01-01
  • 2016-06-08
相关资源
最近更新 更多