这是我在 Controller 中的代码
var q = context.post;
return View(q);
在 View 中
@model IEnumerable<post>
@{
Line1: var question = Model.FirstOrDefault(o => o.parent == null);
Line2: var answers = Model.Where(o => o.parent != null);
}
我已经用 sql-profiler 检查过,每个 line1 和 line2 实体都将 sql-command 发送到数据库。这真的是使用 ORM 的意义和目的吗?或者我做错了什么?
最佳答案
在你的情况下是的。您将集合传递给上下文,并且正在对该集合执行查询。我什至希望这两个查询都从数据库中提取所有帖子并在您的应用程序内存中执行 Linq 查询,因为转换为 IEnumerable<post>
由您的观点定义。如果您只想对数据库执行单个查询,则必须将加载的对象传递给您的 View ,例如:
var q = context.post.ToList();
但是最好创建一个新的 View 模型并在您的 Controller 中执行两个单独的查询 - View 应该是转储的并且它不应该包含任何额外的逻辑:
var postModel = new PostViewModel {
Question = context.post.FirstOrDefault(o => o.parent == null),
Answers = cotnext.post.Where(o => o.parent != null).ToList()
};
return View(postModel);
编辑:
当我查看这些查询时,甚至应该可以使用 Concat
在一次往返数据库中执行它们- 类似的东西:
var result = context.post.Where(o => o.parent != null)
.Concat(context.post.Where(o => o.parent == null)
.OrderBy(...).Take(1))
.ToList();
var postModel = new PostViewModel {
Question = result.FirstOrDefault(o => o.parent == null),
Answers = result.Where(o => o.parent != null).ToList()
};
它未经测试,但您可以尝试一下。
关于c# - 根据每个模型请求往返数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10945044/