2017-09-11 9 views
1

내가 지금처럼 엔티티 프레임 워크를 사용하여 일부 데이터를 retriveing하고 함께 페이징을 결합 :엔티티 프레임 워크 : 동적 LINQ있는 OrderBy

var items = GetItems(storeNumber); 

Sort(items); 

Page(items); 

return await items.ToListAsync(); 

나는이 개인 도우미 메서드가 있습니다

private IQueryable<Item> GetItems(string storeNumber) 
{ 
    return _dbContext.Items.Where(x => x.StoreNumber == storeNumber); 
} 

내가 동적를 사용하여 결과를 정렬을 LINQ. 내 페이지 방법에

private void Sort(IQueryable<Item> items, string fieldToSort, string sortDirection) 
{ 
    items = items.OrderBy($"{fieldToSort} {sortDirection}"); 
} 

내가

방법 '있는 OrderBy는'메소드 전에 호출해야하는 예외를 얻을

private void Page(IQueryable<Item> items, int skip, int take) 
{ 
    items = items.Skip(skip).Take(take); 
} 

가 나는 이유를 의심했다 '건너 뛰기' 항목이 IOrderedQueryable<Item>이어야하지만 이되어야하므로 오류가 발생했습니다.을 반환하는 동적 LINQ OrderBy에 대한 오버로드가 없습니다.. 같은 방법으로 정렬 코드와 페이지 코드를 추출한 경우 var을 사용하면 더 이상 문제가되지 않으므로 해당 코드는 해당 형식을 유추합니다. 문제는 정렬 및 페이징 할 때 IQueryable 인터페이스를 사용하는 것 같습니다. 이 논리를 별도의 메서드로 분해 할 수 있지만 정렬을 위해 동적 LINQ를 사용하는 방법이 있습니까?

도움을 주시면 감사하겠습니다.

+1

문제는 훨씬 더 사소합니다. 현재 'Sort' 메소드는 적용 가능한 쿼리 가능한 연산자로 결과를 반환하지 않기 때문에 효과가 없습니다 (물론 Page 및 LINQ 메소드). 'IQueryable '을 반환하는 메소드로 변경하십시오. 'private IQueryable 정렬 (...) {반환 items.OrderBy (...); }'. 반환 된 결과도 사용하는 것을 잊지 않습니다. –

+0

@IvanStoev 메서드는 void이지만 참조로 항목을 전달하고 있습니다. 확장 쿼리 가능 항목을 설정하고 있습니다. 어쩌면 혼란스러워할까요? – benjrb

+1

개체에 대한 참조를 항목 (메서드의 로컬 변수)에 전달하고 있습니다. 그런 다음 항목 (여전히 로컬 변수)을 변경하면 메서드가 끝납니다. 원하는 것을 얻기 위해서 (외부 아이템 **를 변경하기 위해서)'ref IQueryable items'을 사용해야하거나, 지역 변수'items'를 반환해야합니다. 'return ... '을 사용하는 것이 가장 일반적인 방법입니다. –

답변

2

GetItems()와 마찬가지로 새로 생성 된 IQueryable을 Sort() 및 Page() 메서드에서 반환해야합니다. https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/passing-parameters :이 같은 방법 내부 매개 변수 값을 "다시"경우 C 번호는

더 참조 할 수 있도록이 참조 값에 의한 매개 변수 전달하는 의미를 사용하기 때문에 , 그것은 원래 매개 변수에 전달 된 값에 영향을주지 않습니다

+0

정렬 및 페이지 메서드에 대한 참조로 항목을 전달하고 있습니까, 아니면 혼란 스럽습니까? – benjrb

+0

IQueryable은 인터페이스이므로 참조 유형이지만 참조로 매개 변수를 전달하지는 않습니다. 두 가지는 서로 관련이 없습니다. 참조 유형을 값 (기본 의미)으로 전달하거나 참조로 참조 유형을 전달할 수 있습니다. 참조 유형 (기본적으로 메모리 주소)을 값으로 전달합니다 (따라서 새 블록이 할당되고 참조가 복사되지만 할당을 수행하면 이전 참조가 그대로 유지됩니다). 자세한 내용은이 설명서 예제를 참조하십시오. https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/passing-reference-type-parameters –