2010-01-11 28 views
8

我遇到了這樣的問題:由於LINQ to Entities不支持「自定義方法」,你如何保持DRY?

Custom Methods & Extension Methods cannot be translated into a store expression

基本上我有一些複雜的LINQ查詢,所以想打破他們下到被實現爲返回IQueryables方法子查詢。我希望這些IQueryables可以在LINQ語句中組合在一起(因爲我非常肯定你可以在LINQ to SQL中完成)。

的問題是,如果你試試這個,你得到(例如):

LINQ到實體不承認 方法 「System.Linq.IQueryable`1 [主題] GetThreadsByMostReccentlyPosted(Int32)已' 方法,並且此方法不能將 翻譯成商店表達式。

對我來說,如果你使用LINQ ORM,那麼你需要能夠編寫LINQ查詢。否則,任何常見的查詢邏輯必須複製粘貼&。

鑑於此限制,我該如何保持與LINQ to Entities的DRY?

+0

所以你真正想知道的是「我如何在EF中執行延遲執行,就像我可以在L2S中執行?」。 – 2010-01-11 15:18:59

+0

到目前爲止,我唯一能做的就是將我的IQueryable轉換爲IEnumerable,此時我懷疑你失去了生成最佳SQL語句的能力 – Schneider 2010-01-11 15:20:11

+0

否 - 與延遲執行無關。基本上它不會讓我寫linq語句,其中包括方法 – Schneider 2010-01-11 15:21:02

回答

12

兩種方式:

  1. 方法,返回表達式可以用來
  2. 獨立的可查詢和枚舉位

對於#1,審議:

public Expression<Func<Foo, bool>> WhereCreatorIsAdministrator() 
{ 
    return f => f.Creator.UserName.Equals("Administrator", StringComparison.OrdinalIgnoreCase); 
} 

public void DoStuff() 
{ 
    var exp = WhereCreatorIsAdministrator(); 
    using (var c = new MyEntities()) 
    { 
     var q = c.Foos.Where(exp); // supported in L2E 
     // do stuff 
    } 
} 

對於編號爲2的示例,請閱讀此文章:How to compose L2O and L2E queries。考慮下面給出的例子:

var partialFilter = from p in ctx.People 
        where p.Address.City == 「Sammamish」 
        select p; 

var possibleBuyers = from p in partiallyFilter.AsEnumerable() 
        where InMarketForAHouse(p); 
        select p; 

這可能效率較低,或者可能沒有問題。這取決於你在做什麼。對投影來說通常很好,對於限制通常不會有問題。

更新剛剛看到Damien Guard的an even better explanation of option #1

+0

我更喜歡選項一。 [我寫了一個關於這個主題的博客](http://www.codetunnel.com/blog/post/64/how-to-simplify-complex-linq-expressions),因爲我有一些瘋狂複雜的LINQ表達式,很難維護。必須要做些事情。 – Chev 2011-10-02 18:54:28

0

EF無法組成包含方法的LINQ表達式的查詢。 EF需要文字值來組成SQL。

您將必須處理返回給定案例所需實體超集的「常見」查詢,然後使用擴展方法和LINQ從數據庫返回後縮小返回集。

+0

當你說「常見問題」時,你的意思是IEnumerables?例如有一個結果集,而不是IQueryable? – Schneider 2010-01-11 15:47:16

+0

「常見查詢」我的意思是參數化的查詢,可用於返回您想要的實體的可管理大小的超集。你設計的查詢將取決於你的數據和你有多少。 – 2010-01-11 16:05:23

+0

我明白了。但是這意味着在內存加入等? – Schneider 2010-01-11 16:23:12

相關問題