3

これがコントローラーの私のコードです

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を使用する意味と目的ですか?または私は間違っていますか?

4

1 に答える 1

6

あなたの場合、はい。セットをコンテキストに渡し、そのセットに対してクエリを実行しています。IEnumerable<post>ビューで定義されたへの変換により、両方のクエリがデータベースからすべての投稿を取得し、アプリケーションのメモリ内で Linq クエリを実行したとさえ思います。データベースに対して単一のクエリのみを実行する場合は、次の例を使用して、ロードされたオブジェクトをビューに渡す必要があります。

var q = context.post.ToList();

ただし、新しいビュー モデルを作成し、コントローラーで 2 つの個別のクエリを実行することをお勧めします。ビューはダンプする必要があり、追加のロジックを含めないでください。

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次のようなものを使用して、データベースへの1回のラウンドトリップでそれらを実行することさえ可能であるはずです:

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

テストされていませんが、試すことができます。

于 2012-06-08T08:10:22.540 に答える