Linq to Entities - 使用 Include() 进行预加载
我有这个非常基本的表结构:
dbo.tblCategory
dbo.tblQuestion(与 tblCategory 的多对一关系)
dbo.tblAnswer(与 tblQuestion 的多对一关系)
所以基本上,我想做的是当我加载类别时,我还想加载所有问题和所有答案。
现在,我已经能够使用以下代码来完成此操作:
public tblCategory Retrieve(int id)
{
using (var entities = Context)
{
var dto =
(from t in entities.tblCategory.Include("tblQuestion")
.Include("tblQuestion.tblAnswers")
where t.Id == id
select t).FirstOrDefault();
return entities.DetachObjectGraph(dto);
}
}
}
但是,我并不完全迷恋于此;如果我的模型中的关系名称发生变化;构建项目时我不会收到错误。理想情况下,我想使用 lambda 表达式;像这样:
public tblCategory Retrieve(int id)
{
using (var entities = Context)
{
var dto =
(from t in entities.tblCategory.Include(t => t.tblQuestion)
where t.Id == id
select t).FirstOrDefault();
return entities.DetachObjectGraph(dto);
}
}
现在,使用上面的代码片段;我不知道如何深入到答案表。知道我可以用什么来实现这个 lambda 表达式吗?
I've got this really basic table structure:
dbo.tblCategory
dbo.tblQuestion (many to one relationship to tblCategory)
dbo.tblAnswer (many to one relationship to tblQuestion)
So basically, what I'm trying to do is when I load a category, I want to also load all Questions, and all Answers.
Now, I've been able to do this using the following code:
public tblCategory Retrieve(int id)
{
using (var entities = Context)
{
var dto =
(from t in entities.tblCategory.Include("tblQuestion")
.Include("tblQuestion.tblAnswers")
where t.Id == id
select t).FirstOrDefault();
return entities.DetachObjectGraph(dto);
}
}
}
However, I'm not completely enamored with this; if the relationship names change in my model; I'm not going to get a error when building the project. Ideally, I'd like to use a lambda expression; something like this:
public tblCategory Retrieve(int id)
{
using (var entities = Context)
{
var dto =
(from t in entities.tblCategory.Include(t => t.tblQuestion)
where t.Id == id
select t).FirstOrDefault();
return entities.DetachObjectGraph(dto);
}
}
Now, with the above snippet; I'm stuck on how to drill down to the Answers table. Any idea on what I could use for a lambda expression for this one?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
好的;在 此处。
基本上,我需要这样做:
从上面的链接,我只能取消引用问题集合的单个项目上的 tblAnswers。在这里,我选择取消对集合的第一项的 tblAnswers 的引用。实际上,这个 lambda 表达式仅用于生成属性路径“tblQuestion.tblAnswers”,它将急切加载所有问题的答案。
因此,尽管看起来我只提取了第一个问题的答案,但实际上我提取了所有问题的所有答案。
OK; I was able to get this to work, with some help from here.
Basically, I need to do this:
From the link above, I can only dereference tblAnswers on individual items of the questions collection. Here I chose to dereference tblAnswers on the first item of the collection. In reality, this lambda expression is merely used to produce the property path “tblQuestion.tblAnswers”, which will eager load the answers of all questions.
So even though it looks like I'm only pulling the answers for the first question, I'm actually pulling all the answers for all the questions.