2012-02-13 76 views
1

在我的mvc站點中,我使用EF 4.1進行數據訪問。現在我開發產品搜索功能。用於獲取過濾產品的方法簽名是:實體框架高效查詢過濾器

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。將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」。

實例:

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; 
    } 

正如你可以看到,該方法接受謂詞您可以在調用方法構造如下:

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(); 
    }