- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我们正在使用 EF 6.1。尽管 v4 有所改进,但通常需要帮助 EF 决定如何更高效地生成 SQL。通常有助于在我们的案例中使用 LINQ 并指定连接。
但是,现在我有一个情况,我不知道该怎么做(除了完全绕过 EF 之外):
return db.Testlets.Include("TestTasks.TestQuestions.TestAnswers")
.Include("TestTasks.TestQuestions.TestQuestionCriterionGroups.TestQuestionCriterions")
.Include("TestTasks.TestQuestions.Question.Answers")
.Where(x => x.TestId == testId && x.ShownOn.HasValue)
.ToList();
这会产生非常低效的代码。事实上,如果 EF 产生这样的东西就足够了,也是最好的:
SELECT *
FROM TestLet TL
INNER JOIN TestTask TT ON TL.Guid = TT.TestletId
INNER JOIN TestQuestion TQ ON TT.Guid = TQ.TestTaskId
INNER JOIN TestAnswer TA ON TQ.Guid = TA.TestQuestionId
LEFT OUTER JOIN TestQuestionCriterionGroup TQCG ON TQCG.TestQuestionId = TQ.Guid
LEFT OUTER JOIN TestQuestionCriterion TQC ON TQCG.Guid = TQC.TestQuestionCriterionGroupId
INNER JOIN Question Q ON TQ.QuestionId = Q.QuestionId AND Q.IsActive = 1
INNER JOIN Answer A ON Q.QuestionId = A.QuestionId AND A.IsActive = 1
WHERE
TL.TestId='59ADFB3F-16A6-46E0-8054-7F6E83414DC9'
AND TL.ShownOn IS NOT NULL
我到了下面的代码(最后没有包含)生成上面的 SQL 的地步,但只选择了 teSTLet 列(没有应用包含,因为它们不存在,因此没有映射到 EF 实体) 并且我需要急切加载整个层次结构。当我最后添加 include 时,生成的 SQL 再次变得糟糕且非常慢:
(from tl in
db.Testlets.Where(tl => tl.TestId == testId && tl.ShownOn.HasValue)
from tt in db.TestTasks.Where(tt => tl.Guid == tt.TestletId)
from tq in db.TestQuestions.Where(tq => tt.Guid == tq.TestTaskId)
from ta in db.TestAnswers.Where(ta => tq.Guid == ta.TestQuestionId)
from q in db.Questions.Where(q => tq.QuestionId == q.Id)
from a in db.Answers.Where(a => q.Id == a.QuestionId)
from tqcg in
db.TestQuestionCriterionGroups.Where(tqcg => tq.Guid == tqcg.TestQuestionId).DefaultIfEmpty()
from tqc in
db.TestQuestionCriterions.Where(tqc => tqcg.Guid == tqc.TestQuestionCriterionGroupId)
.DefaultIfEmpty()
select tl).Include("TestTasks.TestQuestions.TestAnswers")
.Include("TestTasks.TestQuestions.TestQuestionCriterionGroups.TestQuestionCriterions")
.Include("TestTasks.TestQuestions.Question.Answers")
有谁知道如何编写 linq2sql 或 entities2sql 代码,这将是有效的并且有正确的结果?或者对于这种更复杂的场景,是否只有放弃 EF 的方法?如果是这样,如何以最简单的方式映射回 EF 结构(从带有上述连接的 SQL)?
如果有人想知道更多关于如何进行左连接的信息:https://msdn.microsoft.com/en-us/library/bb397895.aspx
以及为什么在开头的查询中指定时 Includes 不起作用: http://blogs.msdn.com/b/alexj/archive/2009/06/02/tip-22-how-to-make-include-really-include.aspx
更新:生成的 sql 的要点:https://gist.github.com/Ondrashx/d0347fc807f0f7fbdf46
最佳答案
将查询分成两部分。在 1 中加载 TeSTLets、TestTasks、TestQuestions、TestAnswers,然后在一秒钟内加载其余的——假设 ObjectContexts 具有像 DbContext 那样的自动修复:
类似于:
var results=db.Testlets.Include("TestTasks.TestQuestions.TestAnswers")
.Where(x => x.TestId == testId && x.ShownOn.HasValue)
.ToList();
然后加载 child :
var questionIds=results.TestQuestions.Select(tq=>tq.Guid).ToArray();
db.TestQuestions
.Include("TestQuestionCriterionGroups.TestQuestionCriterions")
.Include("TestTasks.TestQuestions.Question.Answers")
.Where(tq=>questionIds.Contains(tq.Guid))
.Load();
我从未使用过 ObjectContext,但 DbContext 会加载子对象,并在第一个查询中自动修复代理,以便它们都被填充。 (或者应该——我做类似的事情,但加载整个表,而不仅仅是选择的部分)。
如果您的性能问题是由结果集变得太大并且需要传输然后丢弃冗余列数据引起的,这应该有效。如果需要,您当然可以将查询进一步分解为 2 个查询以上,但您需要在传输/处理更少的冗余列与更多的数据库往返之间取得性能改进之间取得平衡。
你也可以尝试这样的事情(我自己从来没有做过,但看起来很有希望......不确定它是否会加载 child )
var conn=new SqlConnection("{Your sqlconnection string}");
conn.Open();
var cmd=new SqlCommand("{Your query}",conn);
var dr=cmd.ExecuteReader();
var result=db.Translate<Testlets>(dr);
关于c# - 如何强制 Entity Framework 生成更高效的 SQL 代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30260918/
我一直很难编辑我的 .htaccess 文件来一起做这三件事。我已经能够分别获得每个部分,但我只是不明白逻辑流程如何使它们全部工作。 这是我能够使用 bluehost support 上的演示进行整合
我制作的宏将模板工作簿保存为两个单独的文件。每个测试保存一个(位置 1、2、3 或 4),然后在另一个宏中使用每个测试的数据。第二个是保留用于备份的原始数据文件。现在的问题是每次我在每个位置运行测试并
我正在写一篇关于如何使用 OCaml 的模块系统而不是 Java 的 OO 系统(一个有趣的视角)的博客文章。我遇到了一些我不理解的关于强制的事情。下面是一个基本模块和两个包含它的模块: module
我有一段将被执行多次(5,000+)的代码,以及一个仅在第一次为真的 if 语句。我曾想过使用“FIRST”变量并每次都进行比较,但每次都检查它似乎是一种浪费,即使我知道它不需要。 bool FIRS
首先,我是 Perforce 的新手,我主要通过其文档进行学习。 因此,我们即将从 CVS 迁移到 Perforce,我最近学到了一个避免更改每个工作区的 P4CLIENT 的好方法,即在工作区根目录
我正在为一段代码编写测试,其中包含我试图涵盖的 IOException 捕获。 try/catch 看起来像这样: try { oos = new ObjectOutputStream(new
我正在尝试在新闻项目滚动之间添加延迟。我知道 $.each() 通过不等待动画完成来完成其工作,但我想知道如何制作它,以便一次向上滚动一个项目并等到最后一个动画完成后再继续在循环中。 $(functi
假设已经编写了一个方法,需要一个排序列表作为其输入之一。当然这将在代码中进行注释和记录,param 将被命名为“sortedList”,但如果有人忘记,则会出现错误。 有没有办法强制输入必须排序?我正
我正在尝试将传入请求重定向到 https://www.domain.com/和所有 https://www.domain.com/ {所有页面}并且没有什么麻烦。我试过的方法: 添加此行:Redire
我将如何实现以下内容: title_selection = raw_input("Please type in the number of your title and press Enter.\n%
我有一个登录表单,我需要强制关闭自动完成功能。我试过了 jquery: $('#login').attr("autocomplete", "off"); HTML: Javascript:docume
我想知道我应该怎么做才能强制从 dev 分支 merge 到我的 master 分支?使用“git merge dev”会导致很多冲突。但是,我不想单独处理它们。相反,我只是想使用我的 dev 分支中
当安装 Hl7.Fhir.DSTU2 和 Hl7.Fhir.R4 这两个 Nuget 包时,我们得到如下信息: DSTU2 包似乎在使用 Hl7.Fhir.Support.Poco 版本 3.4.0
我正在尝试让一个功能组件在 testFn 执行时强制重新渲染。我想使用状态来做到这一点(如果有更好的方法请说出来),这似乎成功地强制重新渲染但只有两次,然后什么都没有。 我构建了一个简单的演示来模拟这
默认情况下,g++ 似乎会省略未使用的类内定义方法的代码。示例 from my previous question : struct Foo { void bar() {} void baz(
我正在尝试使用 here 中介绍的技术使我的网站背景以比内容慢的速度滚动。我不希望背景固定,只希望更慢。 这是 HTML 的样子: .parallax { perspective: 1px;
我能找到的最相似的问题是 'how to create a row of scrollable text boxes or widgets in flutter inside a ListView?'
我有以下 eslint 配置: "object-curly-newline": ["error", { "ImportDeclaration": "never",
我正在使用 TinyMCE 插件并将 valid_elements 选项设置为: "a[href|target:_blank],strong/b,em/i,br,p,ul,ol,li" 即使没有列出数
您好,我想使用以下命令放置多行描述 p4 --field Description="MY CLN Header \\n my CLN complete description in two -thre
我是一名优秀的程序员,十分优秀!