문제

저장소에서 나오는 제품 목록이 있습니다. 충분히 간단합니다. 이제 필터링 및 정렬을 추가하고 싶습니다. 저장소 내부에서 효율성 이득이 없기 때문에 리포지토리 외부에서 분류가 발생할 수 있습니다 (추측). 우리가 관심있는 레코드 만로드하고 싶기 때문에 저장소 밖에서 필터링을하는 것을 상상할 수 없었습니다. 필터 대의원을 만들어 저장소에 전달하고 싶다고 생각합니다.

아래 코드는 의사 C# 코드입니다. 기능 코드는 정렬 / 필터를 사용하는 것이 어떤 모습입니까?

아래의 프로세스는 실제로 대의원을 저장소에 전달하는 데 중점을두고 있습니다.

Product myProduct = Repo.GetProducts( filter );

(MS MVC 인 경우이 코드는 컨트롤러에 존재합니다) :

필터 설정 :

//TODO: Need filter class definition
var filter = new Filter(); // made up object class for now
filter.AddCondition( field, operator, value);  // do this for each filter condition
filter.AddCondition( Product.Name, contains, "Hammer"); // Product.Name ?? (Example)

Product myProducts = Repo.GetProducts( filter ); // the Product call **FILTER**

정렬 설정 :

// TODO: Need sort class definition
var sort = new Sort(); // another made up object class for now
sort.AddOrder( field, priority, sequenceUp) // Sequence enum is ascending/descending
sort.AddOrder( Product.Name, 1, ascending) // (Example) **SORT**

myProducts.AddSort(sort);

보기 모델 반환 :

// Next part strips off unnecessary fields for view (Presentation model)
// So we are not sending a huge data model to the view (hopefully good)
// TODO: Replace string with Service? function to extract a miniProduct from Product

MiniProduct myMinis = MakeMiniProductsFrom( myProducts);  // Service?

// Determine response type (XML, JSON, HTML View) and return appropriate data
// use "x-requested-by" as per Rob Conery noted below
if (Request.IsAjaxRequest()) return Json(myMinis);
else return View(myMinis);

보시다시피,이 코드에는 도움이 필요합니다. 이 작업을 수행 할 수있는 정렬 및 필터 클래스 코드 또는 외부 소스에 대한 링크를 찾고 있습니다. 정렬 및 필터링은 DDD와 디자인 패턴 내의 표준 연습이라고 가정합니다. 따라서 질문입니다. 제품이 평범한 오래된 전자 상거래 제품이라고 가정합니다.) Rob Conery의 Ajax 노트는 여기

감사.

도움이 되었습니까?

해결책

이상적으로는 저장소 내부의 정렬 및 필터링을 수행하고 싶을 것입니다. DB가 할 수있는 것보다 더 효율적으로 정렬 할 수 있고 정렬 된 결과를 직접 반환 할 수 있기 때문에 큰 컬렉션을로드하는 경우 특히 중요합니다.

그만큼 IQueryable<T> 인터페이스는이를 깨끗하게 처리하도록 설계되었습니다. 엔티티 프레임 워크, LINQ에서 SQL에서 SQL 및 LINQ 제공 업체가있는 기타 데이터베이스의 기초입니다. 지원하려고하는 좋은 점 (적어도 어느 정도) IQueryable<T> 이것은 매우 표준적인 방식으로 저장소를 사용할 수 있습니까? 예를 들어, 유사 코드 사용 IQueryable<T>, 더 보일 수 있습니다 :

IList<Product> myProducts = Repo.Products.Where( p => p.Category == theCategoryToFind ).OrderBy( p => p.Name );

또는 선택적으로, 그냥 :

var products = from p in Repo.Products
               where p.Category == theCategory
               order by p.Name
               select p;

LINQ 지향 데이터 액세스 기술 중 일부가 어떻게 작동하는지 살펴 보는 것이 좋습니다. 아소닉 유용성을 위해 이것을 더 잘 설계 할 수있는 방법에 대한 단서를 제공 할 수있는 (많은 상업 옵션).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top