2017-12-27 11 views
0

작동하는 페이징을 가지고있는 Get 메서드가 있지만 동일한 기본 형식의 여러 엔터티를 반환 할 수 있고 여전히 페이징을 가질 수있는 메서드를 만들고 싶습니다.IQueryable에서 multilpe EF Entities를 사용하여 페이징을 구현할 수 있습니까?

저는 이것이 여러 가지 결과 집합으로 반환되어야한다고 생각하니 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에서 엔티티를 어떻게 모델링 했느냐에 달려 있습니다. 상속 된 클래스가 나는 보통 hierachy 당 테이블을 선택에 simmilar 경우 EF는 different strategies with inheritance

을 따를 수 있습니다. 선택한 전략은 SQL 성능에 영향을 줄 수 있지만 선택한 전략의 비즈니스 논리에서 추상화 할 수 있습니다.

당신은 목록을 채우기 위해 한 번 EF를 호출 할 필요 EF는 해당 상속 클래스로 데이터를 재 통합 : 당신의 BLL에서 List<T>을 반환하는 대신

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

나는 이것이 내가 찾고있는 것이라고 생각한다. 필자는 항상 Entity 방식으로 Table을 작성했으나 이것은 매우 유망 해 보입니다. 내가 볼 수있는 유일한 단점은 많은 테이블/엔티티를 결합하여 정말 넓은 테이블을 만들 수 있다는 것입니다. 다른 것들 또는 제한 사항은 코드 또는 DB 측면을 인식하고 있습니까? – user3953989

+0

테이블 당 유형 대 테이블 당 계층 구조는 결과가 페이지되는 방법에 영향을 미치지 않아야합니다. 상속 패턴을 사용하여 페이징을 수행 할 수 있어야합니다. –

+0

@BradleyUffner 나는 페이징에 국한된 것이 아니라 일반적인 모든 효과를 의미했습니다. – user3953989

1

,하는 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