繁体   English   中英

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

[英]Can I use multilpe EF Entities in a IQueryable to implement paging?

我有一个具有工作分页功能的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;
}

这实际上取决于您如何在EF中建模实体。 EF可以遵循不同的继承策略

如果继承的类是类似的,我通常每个层次选择一个 所选策略可能会影响SQL性能,但是您可以抽象所选策略的业务逻辑。

您只需调用一次EF即可填充列表,EF会将数据重新整合到相应的继承类中:

repo.Get<Food>(e => e.userId == userId).ToList());

而不是从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(),
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM