Ищу рекомендации для 3-уровневого LINQ Query в Entity Framework - PullRequest
3 голосов
/ 20 января 2011

В настоящее время у меня есть запрос LINQ, который корректно извлекает все относящиеся к опросу вопросы и связанные с ними ответы.В этом запросе я использую метод .Include () для получения ответов.Мне нравится этот подход, потому что он делает код в моем представлении простым - в основном у меня есть @foreach для ответов, вложенных в @foreach для вопросов.

Теперь я хотел бы добавить специфичный для ответатакую ​​информацию, как количество голосов за сегодня, количество голосов на этой неделе и общее количество голосов.Опять же, они будут извлекаться и отображаться для каждого ответа на каждый вопрос.

Существует ли эффективное решение LINQ, которое позволило бы мне продолжать использовать мой метод .Include () и вложенные циклы @foreach, или мне нужноудалить метод .Include () и использовать объединения, чтобы собрать все вместе?

Если это имеет значение по соображениям производительности, это пишется в .net MVC-3.

Заранее спасибо за ваши мнения / предложения.

1 Ответ

0 голосов
/ 20 января 2011

Мне нравится этот подход, потому что он делает код в моем представлении простым - в основном у меня есть @foreach для ответов, вложенных в @foreach для вопросов.

Лично яне был бы удовлетворен этим.Зачем писать циклы в вашем представлении, когда вы можете использовать Display Temapltes?Что касается вашего вопроса о включении количества голосов сегодня, количества голосов на этой неделе и количества голосов в целом, ответ, как всегда, заключается в использовании модели представления, которая специально адаптирована к потребностям представления:

public class QuestionViewModel
{
    public int VotesToday { get; set; }
    public int VotesThisWeek { get; set; }
    public int TotalVotes { get; set; }
    public IEnumerable<ResponseViewModel> { get; set; }
}

тогда вы передадите IEnumerable<QuestionViewModel> вашему представлению, и оно будет выглядеть так:

@model IEnumerable<AppName.Models.QuestionViewModel>
@Html.DisplayForModel()

и в ~/Views/Shared/DisplayTemplates/QuestionViewModel.cshtml

@model AppName.Models.QuestionViewModel
<div>@Model.VotesToday</div>
<div>@Model.VotesThisWeek</div>
<div>@Model.TotalVotes</div>
@Html.DisplayFor(x => x.ResponseViewModel)

и в~/Views/Shared/DisplayTemplates/ResponseViewModel.cshtml:

@model AppName.Models.ResponseViewModel
<div>@Model.Body</div>

Теперь это чистый вид.

Давайте теперь перейдем к контроллеру:

public class QuestionsController: Controller
{
    private readonly IQuestionsRepository _repository;
    public QuestionsController(IQuestionsRepository _repository)
    {
        _repository = repository;
    }

    public ActionResult Index()
    {
        IEnumerable<Question> model = _repository.GetQuestions();
        IEnumerable<QuestionViewModel> viewModel = Mapper
            .Map<IEnumerable<Question>, IEnumerable<QuestionViewModel>>(model);
        return View(viewModel);
    }
}

Здесь мы абстрагировали доступ к данным в хранилище, чтобы контроллер никогда не знал ничего о EF или какой-либо другой технологии доступа к данным, которой вы являетесь.с помощью.Контроллер должен знать только о вашей модели, вашей модели представления и абстракции о том, как манипулировать моделью (в данном случае интерфейсе репозитория).

Что касается преобразования между вашей моделью и моделью представленияВы можете использовать AutoMapper (в моем примере это Mapper.Map<TSource, TDest>).

Что касается хранилища, то это деталь реализации: выполняете ли вы один или три запроса к вашей базе данныхтебе решать.Все, что вам нужно, - это то, что вы способны собирать необходимую информацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...