这是我在Controller中的代码
var q = context.post;
return View(q);
在视图中
@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的真正意义和目的吗?或者我做错了?
答案 0 :(得分:6)
在你的情况下是的。您将set传递给上下文,并且您正在对该集执行查询。我甚至希望这两个查询从数据库中提取所有帖子,并在应用程序的内存中执行Linq查询,因为转换为您的视图定义的IEnumerable<post>
。如果只想对数据库执行单个查询,则必须使用例如:
var q = context.post.ToList();
但最好是在控制器中创建一个新的视图模型并执行两个单独的查询 - 视图应该是转储,它不应包含任何其他逻辑:
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()
};
没有经过测试,但您可以尝试一下。