此问题与this
有关我决定更改Generic Repository模式,并为每个实体使用特定的存储库。但是我只是无法找到如何使它工作,因为在我的HTML中我需要显示相关实体的一些字段。
用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>
答案 0 :(得分:0)
我个人喜欢IList&lt; T&gt;但这当然是个人选择
要简单地包含一个相关的表(这个不使用RelatedEntityName的字符串的语法,如.Include(“RelatedEntityName”)我认为如果我没记错的话,就会在4.1中添加:
return context.ApplicationsPositionHistory.Where(d => d.applicantPosition.ApplicantID == applicantId && d.applicantPosition.PositionID == positionId).Include(o=>o.RelatedEntityName);
永远不要从存储库返回IQueryable。它不容易测试,因为这是特定于提供商的。
我还会创建单独的方法如果调用者也不需要其他详细信息。
答案 1 :(得分:0)
回答你的第二个问题:
绝对最好使用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);
}
你可以创建一个名为ApplyPaging的IQueryable扩展方法,它看起来像:
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,那么分页可以由客户端而不是正确构建查询的数据库完成。