2010-02-11 85 views
16

我有一個類Post這是一個Entity Framework模型。它包含了這樣的特性:如何在LINQ-to-Entities查詢中使用自定義屬性?

public bool Showable { 
    get { 
    return this.Public && this.PublishedDate > DateTime.now 
    } 
} 

我可以用它在這樣的查詢:

from p in db.Posts where p.Showable select p; 

,但是當我有一個使用它的屬性,這樣

public IEnumerable<Post> ShowablePosts { 
    get { 
    return from p in db.Posts where p.Showable select p; 
    } 
} 

那麼我做不到:

from p in ShowablePosts where p.Id > 42 select p; 

它s ays:

LINQ to Entities不支持指定的類型成員'Showable'。僅支持初始化程序,實體成員和實體導航屬性。

回答

1

不幸的是,實體框架根本不支持計算特性(也就是說,返回一個計算值,而不是一個參考支持字段屬性),但it may be supported at a future date.

+0

我可以在查詢中調用計算屬性,但不能在運行查詢的方法中調用。有點奇怪。 – Pablo 2010-02-11 01:41:33

+0

我現在生活在Linq-to-SQL的世界裏,是從'db.Posts'中返回p。可顯示select p;'本地是'IQueryable '還是'IEnuemerable '在EF中?這對他的問題有影響嗎? – 2010-02-11 01:42:54

+0

@J。 Pablo Fernandez:當您定義Linq查詢時,只有當您執行需要實際結果的事情時才執行。 Linq支持很多事情,但實體框架不支持,而這些事情只有在執行查詢後纔會變得明顯。 – 2010-02-11 03:34:45

19

,如果你能做到這一點您將該屬性編寫爲Expression,可翻譯爲SQL。

Here's how to do it.

這是一個有點複雜,因爲它是一個複雜的問題的通用解決方案。

總的想法是這樣的:LINQ to Entities(如所有 LINQ提供程序)無法在運行時將編譯後的代碼(如屬性)轉換爲SQL。 LINQ to Objects可以執行編譯的代碼,但是它不能翻譯它。但他們可以翻譯Expression<T>。所以,你可以寫:

public static Expression<Func<Post, bool>> WhereActive 
{ 
    get 
    { 
     return p => p.Public && p.PublishedDate > DateTime.Now; 
    } 
} 

然後,你可以寫:

public IEnumerable<Post> ShowablePosts 
{ 
    get 
    { 
     return db.Posts.Where(WhereActive); 
    } 
} 

...和LINQ to實體可以翻譯這一點。鏈接後的代碼概括了這個想法。

+0

有沒有辦法將參數傳遞給WhereActive?例如DateTime。如果是這樣,您可能能夠回答https:// stackoverflow。com/q/48497487/2968001 – 2018-01-29 10:13:49

0

我認爲最簡單的方法是使用DelegateDecompiler.EntityFrameworkComputed屬性,該屬性在this answer中提到。

相關問題