Как загрузить связанные сущности, используя Entity Framework и Repository Pattern - PullRequest
0 голосов
/ 27 октября 2011

Этот вопрос относится к этому

  1. Я решил изменить шаблон общего репозитория и использовал отдельный репозиторий для каждой сущности.Однако я просто не могу найти, как заставить это работать, потому что в моем html мне нужно показать некоторые поля из связанных сущностей.

  2. Лучше ли заменить Ienumerable на Iqueryable?

Интерфейс репозитория

 public interface IApplicantPositionRepository : IDisposable
    {
        IEnumerable<ApplicationPositionHistory> GetApplicationPositionHistories(int applicantId, int positionId);
                   void Save();
    }

Реализация интерфейса репозитория.

public IEnumerable<ApplicationPositionHistory> GetApplicationPositionHistories(int applicantId, int positionId)
        {
            return context.ApplicationsPositionHistory.Where(d => d.applicantPosition.ApplicantID == applicantId && d.applicantPosition.PositionID == positionId);
        }

Метод контроллера

public ViewResult History(int applicantId, int positionId)
        {
            var history=applicantPositionRepository.GetApplicationPositionHistories(applicantId, positionId);
            return View(history);
        }

HTML.

@foreach (var item in Model) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.applicantPosition.Applicant.name)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.applicantPosition.Position.name)
        </td>

Ответы [ 2 ]

0 голосов
/ 27 октября 2011

Чтобы ответить на ваш второй вопрос:

Определенно предпочтительнее использовать IQueryable вместо IEnumerable.Делая это, вы можете сделать что-то вроде этого:

Controller:
public ActionResult Index(int page = 1, int pageSize = 10)
{
    IQueryable<Entity> items = repository.GetEntities();

    items = items.ApplyPaging(page, pageSize);

    return View(items);
}

Вы можете создать из IQueryable метод расширения, называемый ApplyPaging, который выглядит следующим образом:

public static class QueryableExtensions
{
    public static IQueryable<T> ApplyPaging<T>(this IQueryable<T> source, int page = 1, int pageSize = 10)
    {
        return source.Skip((page - 1) * pageSize).Take(pageSize);
    }
}

Если это был IEnumerable, тогда подкачка можетвыполняется клиентом, а не базой данных, которая правильно строит запрос.

0 голосов
/ 27 октября 2011

Лично мне нравится IList , но это, конечно, личный выбор

Чтобы включить связанную таблицу, просто сделайте это (этот синтаксис не использует строку для RelatedEntityName, например .Include ("RelatedEntityName"). Я думаю, что был добавлен в 4.1, если я правильно помню:

 return context.ApplicationsPositionHistory.Where(d => d.applicantPosition.ApplicantID == applicantId && d.applicantPosition.PositionID == positionId).Include(o=>o.RelatedEntityName);

Никогда не возвращать IQueryable из репозитория. Это нелегко проверить, так как это очень зависит от поставщика.

Я бы также создал отдельные методы , если вызывающему также не требуются дополнительные подробности.

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