【问题标题】:How to load the related entities using Entity Framework and the Repository Pattern如何使用实体框架和存储库模式加载相关实体
【发布时间】:2011-10-27 14:17:36
【问题描述】:

此问题与this有关

  1. 我决定更改通用存储库模式并为每个实体使用特定的存储库。但是我只是找不到如何使它工作,因为在我的 html 中我需要显示来自相关实体的一些字段。

  2. 用 Iqueryable 代替 Ienumerable 会更好吗?

存储库接口

 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>

【问题讨论】:

标签: asp.net-mvc asp.net-mvc-3 entity-framework entity-framework-4


【解决方案1】:

我个人喜欢 IList 但这当然是个人选择

要包含相关表,只需执行此操作(如果我没记错的话,我认为不使用 .Include("RelatedEntityName") 之类的字符串作为相关实体名称的语法是在 4.1 中添加的:

return context.ApplicationsPositionHistory.Where(d => d.applicantPosition.ApplicantID ==申请人Id && d.applicantPosition.PositionID == positionId).Include(o=>o.RelatedEntityName);

永远不要从存储库返回 IQueryable。它不容易测试,因为这是特定于提供商的。

我也会创建单独的方法如果调用者也不需要额外的细节。

【讨论】:

  • 并非如此。您可以轻松调用 List.AsQueryable()
  • 我有这个错误。你确定语法正确吗? “System.Linq.IQueryable”不包含“Include”的定义,并且没有扩展方法“Include”接受“System.Linq.IQueryable”类型的第一个参数可以找到(您是否缺少 using 指令或程序集引用?)我已经有 System.LINQ。
  • 确保在类的顶部使用 System.Data.Entity 和 using System.Linq using 语句。
  • @Dismissile 认为我在这里错过了您的观点。您可以从列表中创建 Queryable 这一事实与 IQueryable 提供程序的操作方式彼此不同,因此很难准确测试,因为您的模拟实现可能与实际实现不同。这是众所周知的,并且是对存储库的具体建议-不是我编造的:)
  • Adam,返回类型不应该是个人喜好的问题 :) 最佳实践(不仅适用于存储库,而且适用于所有类,尤其是接口)是尽可能使用最不具体的类。因此,当您不需要 IList 中的特殊内容时,您只想执行 foreach,您应该使用 IEnumerable。
【解决方案2】:

回答你的第二个问题:

绝对最好使用 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,那么分页可以由客户端完成,而不是由数据库正确构建查询。

【讨论】:

猜你喜欢
  • 2010-12-11
  • 2014-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多