2012-02-13 3 views
1

내 MVC 사이트에서 데이터 액세스를 위해 EF 4.1을 사용합니다. 이제 제품 검색 기능을 개발합니다. 필터링 된 제품을 얻는 방법 서명은 다음과 같습니다Entity Framework 효율적인 쿼리 필터

PagedList<Dress> GetDressesPage<TKey>(int page, int dressesPerPage, Func<Dress, bool> selection, Func<Dress, TKey> order, SortDirection direction); 

나는 제품을 얻을 수있는 방법은 다음과 같습니다

dresses = _context.Dresses.Where(selection).OrderBy(order).Skip(page * dressesPerPage).Take(dressesPerPage).ToList(); 

문제는 기능 선택 함께. 나는 다른 조건을 덧붙임으로써 그것을 구성 할 수 있기를 바란다. 이제 매개 변수의 각 조합에 대해 if 절을 사용하여 구성 중입니다 ... 그러나 너무 복잡해집니다.

필터를 매개 변수로 전달할 수있는 더 간단한 방법을 알고 있습니까?

답변

4

Predicate Builder을 사용

public static IEnumerable<DressItem> QueryDresses(FashionEntities ctx, Expression<Func<dresses, bool>> predicate) 
    { 
     var query = (from dress in ctx.dresses 
         .AsExpandable() 
         .Where(predicate)      
        select new DressItem { 
         id = dress.Id, 
         name = dress.Name, 
         price = dress.Price 
        }; 
     return query; 
    } 

당신이 볼 수 있듯이, 방법은 다음과 같이 호출하는 방식으로 구성 할 수있는 조건을 받아들입니다. Func<Dress, bool>Expression<Func<Dress, bool>>으로 바꿉니다. 그렇지 않으면 쿼리가 LINQ-to-Objects로 바뀝니다.

var predicate = PredicateBuilder.True<Dress>(); 
    if (!string.IsNullOrEmpty(name)) 
    { 
     predicate = predicate.And(d => d.Name.Contains(name)); 
    } 

    dresses = _context.Dresses.Where(predicate).OrderBy(order) 
     .Skip(page * dressesPerPage).Take(dressesPerPage).ToList(); 
0

완벽한 라이브러리는 "LinqKit"입니다.

사용 예제는 :

Expression<Func<dresses, bool>> predicate = d => d.Price > 1000; 

    if (lalalala == llalala) { 
     predicate = d => d.Price > 2000; 
    } 

    var result = new List<DressItem>(); 
    using (var ctx = new FashionEntities()) 
    { 
     var dresses = QueryDresses(ctx, predicate.Expand()); 
     result = dresses.ToList(); 
    }