2012-06-08 4 views
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-профайлера, каждый line1 и line2 объект посылает SQL-команду в базу данных. это действительно смысл и цель использования ОРМ? или я ошибаюсь?

+3

Вы можете попытаться выполнить 'var q = context.post.ToList();' в контроллере и посмотреть, помогает ли это. :) –

+0

@ Trustme-I'maDoctor - Я доверяю вам, доктор – Mironline

ответ

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

Edit:

Как я смотрю на эти вопросы, это должно быть возможно даже выполнить их в один туда и обратно в базу данных с помощью 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() 
       }; 

Он не проверял, но вы можете дать ему попробовать.

Смежные вопросы