2014-12-23 63 views
1

對於實體框架,我有一組標準化的查找表。我正在嘗試爲這些表格集合開發一個通用例程,其中EffectiveDate和EndDate在今天之間。如果有一種常見的方式,我可以動態地設置謂詞,我不必爲每個表設置它。公共參考數據的查詢條件

每個查找實現一個接口:

public class LookupType : IEffectiveEndDates 
{ 

    public DateTime EffectiveDate { get; set; } 

    public DateTime? EndDate { get;set; } 

} 

我可以結合使用此接口的東西來定義一個通用查詢所有的方法?

+0

只是爲了說明一下:你想抓住今天在生效日期和結束日期之間掉落的所有數據,對嗎? – IronMan84

+0

是的,所有數據只使用這兩個字段。 –

回答

1

您可以從接口創建謂詞並在LINQ語句中使用它。

var date = DateTime.Now; 
Expression<Func<IEffectiveEndDates,bool>> pred = 
    x => x.EffectiveDate <= date && x.EndDate >= date; 

var lookups = db.ConcreteLookups.Where(pred).ToList(); 

此操作,因爲 -

  1. 編譯器接受它:Func定義爲Func<in T, out TResult>,這意味着對於該實體(T)類型參數是逆變的,所以一個Func<IEffectiveEndDates,bool>還可以傳遞爲一個Func<ConcreteLookup,bool>
  2. 查詢提供程序成功將表達式轉換爲SQL,因爲所有屬性表達式都有正確的名稱。
+0

我認爲你需要翻轉標誌。它不應該是'x.EffectiveDate <= date && x.EndDate> = date'? – IronMan84