2017-12-27 232 views
0

我有一个Get方法有工作分页,但我也想创建一个方法,可以返回多个相同的基本类型的实体,仍然有分页。我可以在IQueryable中使用multilpe EF实体来实现分页吗?

我知道这必须转化为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; 
} 

回答

1

这实际上取决于你如何建模EF中的实体。 EF可以按照different strategies with inheritance

如果继承的类simmilar我通常选择按层次结构表。 所选策略会影响SQL性能,但您可以在所选策略的业务逻辑中进行抽象。

你只需要调用一次EF填充列表和EF数据重新集成到相应的继承类:

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

我相信这就是我要找的。我一直以Table per Entity的方式完成,但这看起来很有希望。我看到的唯一可能的缺点是将许多表/实体组合在一起可以构成一个非常宽泛的表,任何其他事物或限制要意识到代码或数据库端? – user3953989

+0

Table-Per-Type与Table-Per-Hierarchy不应该对分页结果有任何影响。您应该能够使用继承模式进行分页。 –

+0

@BradleyUffner我的意思是一般的任何效果,而不是特定于分页。 – user3953989

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(), 
    } 
} 
+1

我已经在我的代码中实际使用了该表。我只是简化了示例,将重点放在了另一个问题上。我需要以某种方式结合“水果”和“蔬菜”,并从EF正确分页。我相信@mnieto发布的继承答案更多的是正确的方向。 – user3953989

+0

@ user3953989从你的文章来看,“食物”是一个基础实体*还是基础类,目前还不清楚。 –

+0

@IvanStoev我不相信我知道区别。目前它只是一个基类(只存在于代码中)。 – user3953989

相关问题