2010-01-05 1 views
2

저장소에서 오는 제품 목록이 있습니다. 충분히 간단합니다. 이제 필터링 및 정렬을 추가하고 싶습니다. 저장소 내에서 효율성 향상이 일어나지 않으므로 저장소 외부에서 정렬이 발생할 수 있습니다 (추측). 우리가 염려하는 레코드 만로드하고자하므로 저장소 외부에서 필터링하는 것을 상상할 수 없습니다. 필자는 필터 델리게이트를 생성하여 저장소에 전달하려고한다고 생각합니다.필터링 및 정렬에 대한 간단한 저장소 질문

아래 코드는 의사 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 노트는 here

입니다.

답변

4

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

IQueryable<T> 인터페이스는이를 완벽하게 처리하도록 설계되었습니다. 이는 Entity Framework, LINQ to SQL 및 LINQ 공급자가있는 다른 데이터베이스의 기초입니다. IQueryable<T>을 지원 (적어도 어느 수준에서)하는 것이 좋습니다. 이는 매우 표준적인 방식으로 저장소를 사용할 수있게 해줍니다. 다만, 선택적으로,

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

을 또는 : 예를 들어, IQueryable<T>를 사용하여 의사는 더 좋아 보일 수 있습니다

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

내가보고 추천하는 방법 LINQ 지향 데이터 액세스 기술 작업의 일부 - Subsonic (많은 상용 옵션은 물론)과 같은 오픈 소스 옵션이 꽤있어 유용성을 위해이를 더 잘 디자인 할 수있는 방법에 대한 단서를 제공 할 수 있습니다.

+0

그렇다면 ORM이 POCO 클래스에 대한 정렬 및 필터링을 제공해야한다고 말하고 있습니다 (예 : 반복자 패턴 등을 사용하는 경우)? –

+0

이상적으로는 그렇습니다. DB가이를 처리해야하기 때문에 ORM과 데이터 계층에서 정렬 및 필터링을 처리하기를 원합니다. IQueryable 을 사용하면 실제 필터 + 정렬이 DB에 직접 매핑됩니다. –

+0

예를 들어, Linq to Sql이 지원됩니다. 따라서 dc.Products.where (x => x.Name.contains ("Hammer"))를 사용하고 계속 추가 할 것입니다.내가 추가 필터를 가지고있는 한 wheres. 그래서 저장소 목록에 큰 foreach 문을 만들어 조건 목록을 받아 들여 .where() 메서드로 적용해야합니다. 정렬하는 한, 나는 같은 것을 할 것입니다. 오더 바이 (x => x.Name)? 내 대리자를이 컨트롤러로 구성한 다음 저장소 메서드의 매개 변수로 전달 하시겠습니까? –