繁体   English   中英

为什么我通过LINQ to Entities通过相同查询生成的SQL运行得到不同的结果?

[英]Why am I getting different results via LINQ to Entities that via run of SQL generated by the same query?

我正在上一个学期的一个学校项目,该项目是另一个学期开始的。 这个学期我在一个团队中负责完成这个项目。 小组之间有零度普通人..我的团队是一个全新的团队,试图用很少甚至没有文档的方式完成另一个团队的项目。

无论如何,在没有这种背景的情况下,我对该项目有疑问。 我的实体框架似乎不喜欢我创建的视图。 值得一提的是,在创建此视图时,它是一个复杂的视图,是通过联接约6-7个表创建的

作为一项任意测试(我真的不需要其中包含“ what”的答案),我已经在SQL Management Studio中执行了此查询

SELECT *
FROM [dbo].[Course_Answers_Report] -- Course_Answers_Report is a View
WHERE question like '%what%'

产生以下输出:

survey_setup_id | course_number | crn_number | term_offered |        course_title           | Instructor_Name    | question_type_id |                   question                           | answer
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2617            |    107013     |    5001    |    201505    |  Advanced Microsoft Access    | -output ommited-   |      2           | I  understood what the teacher was saying.           |    A
2617            |    107013     |    5001    |    201505    |  Advanced Microsoft Access    | -output ommited-   |      2           | I can apply what I learned in this class.            |    A
2617            |    107013     |    5001    |    201505    |  Advanced Microsoft Access    | -output ommited-   |      2           | I understood what was expected of me in this course. |    A

现在在Visual Studio中,我有少量的代码(作为一小部分说明,这是在MVC中,但是问题不在于MVC,而在于LINQ,实体或控制器中的某个位置。通过调试来决定)。

public ActionResult modelTest()
{
        using (SurveyEntities context = new SurveyEntities())
        {
                context.Database.Log = s => System.Diagnostics.Debug.WriteLine(s);

                var questions = context
                                .Course_Answers_Report
                                .Where(r => r.question.Contains("what"))
                                .ToList();

                ViewBag.Questions = questions;
         }
}

这将在View上输出下表(同样,问题肯定不在View中,因为在调试时,保存List的var具有所有不正确的数据)

survey_setup_id | course_number | crn_number | term_offered |        course_title           | Instructor_Name    | question_type_id |                   question                           | answer
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2617            |    107013     |    5001    |    201505    |  Advanced Microsoft Access    | -output ommited-   |      2           | I understood what the teacher was saying.            |    A
2617            |    107013     |    5001    |    201505    |  Advanced Microsoft Access    | -output ommited-   |      2           | I understood what the teacher was saying             |    A
2617            |    107013     |    5001    |    201505    |  Advanced Microsoft Access    | -output ommited-   |      2           | I understood what the teacher was saying.            |    A

如您所见,此输出是不正确的,因为问题(或记录)在应为

此linq语句生成的SQL是

SELECT 
[Extent1].[survey_setup_id] AS [survey_setup_id], 
[Extent1].[course_number] AS [course_number], 
[Extent1].[crn_number] AS [crn_number], 
[Extent1].[term_offered] AS [term_offered], 
[Extent1].[course_title] AS [course_title], 
[Extent1].[Instructor_Name] AS [Instructor_Name], 
[Extent1].[question_type_id] AS [question_type_id], 
[Extent1].[question] AS [question], 
[Extent1].[answer] AS [answer]
FROM (SELECT 
[Course_Answers_Report].[survey_setup_id] AS [survey_setup_id], 
[Course_Answers_Report].[course_number] AS [course_number], 
[Course_Answers_Report].[crn_number] AS [crn_number], 
[Course_Answers_Report].[term_offered] AS [term_offered], 
[Course_Answers_Report].[course_title] AS [course_title], 
[Course_Answers_Report].[Instructor_Name] AS [Instructor_Name], 
[Course_Answers_Report].[question_type_id] AS [question_type_id], 
[Course_Answers_Report].[question] AS [question], 
[Course_Answers_Report].[answer] AS [answer]
FROM [dbo].[Course_Answers_Report] AS [Course_Answers_Report]) AS [Extent1]
WHERE [Extent1].[question] LIKE N'%what%'

在SQL Management Studio中运行此SQL时,会产生适当的结果。 我对为什么EF采取这种方式感到困惑,任何人都可以提供见解

编辑:每丹尼Varod的要求,EDMX可以在这里找到http://pastebin.com/dUf6J4fV和视图可以在这里找到http://pastebin.com/sCsqNYWc (视图是一种丑恶/马虎,因为它本来应该是一个测试和实验)

您的问题在edmx文件中可见;

警告6002:表/视图'wctcsurvey.dbo.Course_Answers_Report'没有定义主键。 已推断出键,并且已将定义创建为只读表/视图。

<EntityType Name="Course_Answers_Report">
<Key>
    <PropertyRef Name="survey_setup_id" />
</Key>

您尚未在表中定义主键,因此已被“猜测”。 由于猜测的列survey_setup_id在表中不是唯一的(正确结果中的所有3行都具有相同的值),因此EF会感到困惑,并且会提取相同的对象3次(毕竟具有相同的猜测的主键)。

如果您在模型中添加了正确的主键注释(即唯一字段),问题将消失。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM