在每个模型请求上往返数据库?

Mir*_*ine 3 c# orm entity-framework asp.net-mvc-3

这是我在Controller中的代码

var q = context.post;
return View(q);
Run Code Online (Sandbox Code Playgroud)

在视野中

@model IEnumerable<post>
@{
  Line1:  var question = Model.FirstOrDefault(o => o.parent == null);
  Line2:  var answers = Model.Where(o => o.parent != null);
}
Run Code Online (Sandbox Code Playgroud)

我用sql-profiler检查过,每个line1line2实体都将sql-command发送到数据库.这是使用ORM的真正意义和目的吗?或者我做错了?

Lad*_*nka 6

在你的情况下是的.您将set传递给上下文,并且您正在对该集执行查询.我甚至希望两个查询从数据库中提取所有帖子并在应用程序的内存中执行Linq查询,因为转换为IEnumerable<post>您的视图定义.如果只想对数据库执行单个查询,则必须使用以下方法将加载的对象传递给视图:

var q = context.post.ToList();
Run Code Online (Sandbox Code Playgroud)

但最好是在控制器中创建一个新的视图模型并执行两个单独的查询 - 视图应该是转储,它不应包含任何其他逻辑:

var postModel = new PostViewModel {
                    Question = context.post.FirstOrDefault(o => o.parent == null),
                    Answers = cotnext.post.Where(o => o.parent != null).ToList()
                };
return View(postModel);
Run Code Online (Sandbox Code Playgroud)

编辑:

当我正在查看这些查询时,甚至可以使用以下方式在一次往返数据库中执行它们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()
                };
Run Code Online (Sandbox Code Playgroud)

它没有经过测试,但您可以尝试一下.