我有一个Get
方法有工作分页,但我也想创建一个方法,可以返回相同基类型的多个实体,但仍然有分页。
我知道这必须以某种方式转换为SQL,我想这将不得不作为多个结果集返回。
// Model classes
public class Food
{
string Name {get;set;}
}
public class Fruit : Food
{
bool IsSweet {get;set;}
}
public class Vegetable : Food
{
bool IsGross {get;set;}
}
// FruitRepo -- BLL layer
public List<Fruit> GetFruit(int userId, int page, int itemsPerPage)
{
var query = repo.Get<Fruit>(e => e.userId == userId);
var dbResults = query.Skip((itemsPerPage * page) - itemsPerPage).Take(itemsPerPage).ToList();
return dbResults;
}
// FoodRepo -- BLL layer
public List<Food> GetFood(int userId, int page, int itemsPerPage)
{
// How can I use IQuerable here to implement paging correctly?
List<Food> rv = new List<Food>();
var repo = new Repo();
rv.AddRange(repo.Get<Fruit>(e => e.userId == userId).ToList());
rv.AddRange(repo.Get<Vegetable>(e => e.userId == userId).ToList());
return rv;
}
答案 0 :(得分:1)
这实际上取决于您如何在EF中建模实体。 EF可以关注different strategies with inheritance
如果继承的类是simmilar我通常选择 table per hierachy 。 所选策略可以影响SQL性能,但您可以在所选策略的业务逻辑上进行抽象。
您只需要调用EF一次填充列表,EF就会将数据重新集成到相应的继承类中:
repo.Get<Food>(e => e.userId == userId).ToList());
答案 1 :(得分:1)
不是从BLL返回List<T>
,而是返回PagedList<T>
,其中包括页数:
Public class PagedList<T> {
public List<T> Results { get; set; }
public int PageNumber { get; set; }
public int TotalCount { get; set; }
}
然后,您的GetFruit
/ GetFood
方法可能如下所示:
public List<Fruit> GetFruit(int userId, int page, int itemsPerPage)
{
var query = repo.Get<Fruit>(e => e.userId == userId);
var dbResults = query.Skip((itemsPerPage * page) - itemsPerPage).Take(itemsPerPage).ToList();
return new PagedList<Fruit>()
{
Results = dbResults,
PageNumber = page,
TotalCount = query.Count(),
}
}