2017-12-27 229 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

相關問題