2010-10-19 38 views
9

所以我有一個使用CTP4代碼第一特性在實體框架4中創建的模型。這一切都很好地結合在一起。實體框架代碼第一和搜索條件

我正在嘗試將高級搜索功能添加到我的應用程序中。這種「高級搜索」功能只允許用戶輸入多個標準進行搜索。例如:

高級產品搜索

  • 名稱
  • 開始日期
  • 結束日期

這將允許用戶通過產品名稱來搜索,也限制了結果的創建日期。

問題是我不知道有多少這些字段將用於任何單個搜索。那麼我的實體框架查詢如何構建呢?

我有an example描述如何爲實體框架創建動態查詢,但是這似乎不適用於我爲Code First持久性創建的POCO類。

約束數量未知時構造查詢的最佳方法是什麼?

回答

20

因此,經過幾小時的工作對這個問題(和我們的朋友谷歌的幫助),我找到了一個可行的解決方案,我的問題。我創建瞭如下的Linq表達式擴展:

using System; 
using System.Linq; 
using System.Linq.Expressions; 

namespace MyCompany.MyApplication 
{ 
    public static class LinqExtensions 
    { 
     public static IQueryable<TSource> WhereIf<TSource>(this IQueryable<TSource> source, bool condition, Expression<Func<TSource, bool>> predicate) 
     { 
      if (condition) 
       return source.Where(predicate); 
      else 
       return source; 
     } 
    } 
} 

這個擴展允許LINQ查詢到這樣創建:

var products = context.Products.WhereIf(!String.IsNullOrEmpty(name), p => p.Name == name) 
           .WhereIf(startDate != null, p => p.CreatedDate >= startDate) 
           .WhereIf(endDate != null, p => p.CreatedDate <= endDate); 

這使得每個WhereIf語句隻影響結果是否符合規定條件。解決方案似乎有效,但我總是接受新的想法和/或建設性的批評。

+0

太棒了!謝謝! – 2012-03-21 20:07:52

+0

+1非常有用的一點點代碼。 – 2013-05-29 18:09:36

+0

我們可以使用in-buil where()。where()但爲什麼應該有人使用你的擴展?那裏有什麼特別的? – 2018-02-11 19:00:48

0

約翰,

你的解決方案是絕對真棒!但是,爲了分享,我一直在使用這種方法,直到我看到你的理想。

var items = context.Items.Where(t => t.Title.Contains(keyword) && !String.IsNullOrEmpty(keyword)); 

因此,它似乎不是最好的解決方案,但肯定是一種解決方法。