我可以在IQueryable中使用multilpe EF实体来实现分页吗?

时间:2017-12-27 16:01:15

标签: c# entity-framework

我有一个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;
}

2 个答案:

答案 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(),
    }
}