2011-05-16 23 views
5

當定義對象的背景下,實體框架首先使用的代碼,例如:我們如何在Entity Framework中做對象過濾?

public class DomainContext : DbContext 
{ 
    public DomainContext() { } 
    public virtual DbSet<News> News { get; set; } 
} 

我們都知道,你可以查詢「新聞報」做這樣的事情(例如,吃出了今天發佈的所有新聞):

var ctx = new DomainContext(); 
ctx.News.Where(x => x.PublishedDate == DateTime.Now.Date) 

但是,這是一個問題:是否有申請預先定義的過濾/條件穿過ctx.News所有查詢的方法嗎?假設我希望ctx.News上的所有查詢具有隱式應用的「已發佈的今日」過濾?

+0

爲什麼不添加一個屬性NewsToday返回'今日新聞'查詢的結果?例如:http://msdn.microsoft.com/en-us/library/bb882532.aspx – Fox32 2011-05-16 20:45:30

回答

0

你可以一個新的屬性添加到您的上下文:

public IEnumerable<News> TodaysNews 
{ 
    get 
    { 
     return this.News.Where(x => x.PublishedDate == DateTime.Now.Date); 
    } 
} 

任何進一步的過濾/排序/等然後可以應用於屬性。

更新:

如果你不能夠僅僅使用預過濾查詢,另一種選擇是在數據庫中創建一個視圖你的實體映射到該視圖。該視圖可以基於當前日期。

+0

是正確的,但這不是我悲傷後的情況。是否沒有辦法將隱式查詢過濾應用於EF內的特定類型的所有對象? – thr 2011-05-16 20:45:01

+0

查看我的更新。也許使用實體映射到視圖會適合你的情況。 – Jacob 2011-05-16 21:04:13

2

我不相信有一種方法可以像您建議的那樣向DbSet<News>對象添加過濾器。但是,你應該是什麼能夠做的僅僅是寫另一個功能:

public virtual IEnumerable<News> TodaysNews 
{ 
    get { return News.WHere(n => n.PublishDate == DateTime.Today); } 
} 

然後,我想,如果你這樣做對其他地方的頂部的查詢,如:

var todaysGoodNews = from n in ctx.TodaysNews 
        where n.IsGood == true 
        select n; 

則將查詢發送給服務器時將其組合在一起,而不是將它作爲兩個單獨的查詢。我不積極,如果這是有效的,當你使用IEnumerable<>或如果你需要返回其他東西(IQueryable<>,也許?)。

編輯:

我剛纔看到下面的其他海報的響應。我想我花了太長時間來輸入/格式。我不知道應用這樣的過濾器的方法,但是我們的解決方案不是有效地做到這一點嗎?你甚至可以讓TodaysNews成爲通過上下文或其他東西直接訪問該對象的唯一方法。

+0

嗯,這樣的工作。但是這樣更復雜一些,我希望能夠自動從應用程序的其餘部分「隱藏」正常的「新聞」(這不是一個特定的應用程序,這是一個普遍的解決方案,是重新使用的公司基本上就像圖書館一樣)。 – thr 2011-05-16 20:51:43

3

無法爲查詢新聞添加自動條件(過濾器)。所有發佈的示例都有效,但前提是您直接查詢News。例如,如果您加載的導航屬性指向News,則示例將失敗。

EDMX通過conditional mapping來解決這個問題,但這會導致其他非常糟糕的缺點。條件映射是固定的(不能在沒有重建模型的情況下進行更改),並且每種類型只能有單一條件 - 就像TPH降級爲單一實體類型。此外,條件映射中定義的條件可能無法與「今天」一起使用。條件映射在代碼優先方法中不可用。

0

我面臨同樣的問題,我發現這個:EntityFramework.FiltersThis post顯示如何使用它。

+0

EntityFramework.Filters庫在過濾器值生命週期中存在一些問題(請參閱問題部分)。 EntityFramework.DynamicFilters(https://github.com/jcachat/EntityFramework.DynamicFilters)沒有這些問題,但它需要將FKs建模爲實體類中的屬性。 – bloparod 2017-07-13 18:18:29

相關問題