【问题标题】:Roundtrip to database on each model request?每个模型请求的数据库往返?
【发布时间】:2012-06-08 07:55:44
【问题描述】:

这是我在控制器中的代码

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 检查过,每个 line1line2 实体都将 sql-command 发送到 database 。这真的是使用ORM的意义和目的吗?还是我做错了什么?

【问题讨论】:

  • 您可以尝试在控制器中执行var q = context.post.ToList(); 看看是否有帮助。 :)
  • @Trustme-I'maDoctor -- 我相信你博士。

标签: c# asp.net-mvc-3 entity-framework orm


【解决方案1】:

在你的情况下是的。您将 set 传递给 context 并且您正在对该 set 执行查询。我什至希望这两个查询都从数据库中提取所有帖子并在您的应用程序内存中执行 Linq 查询,因为转换为您的视图定义的IEnumerable&lt;post&gt;。如果您只想对数据库执行单个查询,则必须将加载的对象传递给您的视图,例如:

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()
                };

它没有经过测试,但你可以试一试。

【讨论】:

    猜你喜欢
    • 2016-10-27
    • 2013-03-16
    • 2012-08-21
    • 2010-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多