2009-11-28 91 views
0

帖子編輯LINQ查詢表達式重用

這將是可能的嗎?

有預編譯

private static Func<SmwrDataContext, int, IQueryable<Xyz>> _validXyzs = 
    CompiledQuery.Compile((Context context, int Id) => 
           from xyz in _db.XYZs 
           join abc in _db.ABCs on xyz.Id equals abc.Id 
           where xyz.TypeId = id && xyz.Flag && abc.Flag 
           select xyz); 

我最初同一個版本庫中直接訪問其內聲明此查詢表達式,曾在消費它沒有問題。

public List<MyItem> GetItemsForValueRange(int xyzTypeId, double floor, double ceiling) 
{ 
    return (from xyx from _validXyzs (_db, xyzTypeId) 
      join num from _db.numbers xyz.ID equals num.lettersId 
      where 
       num.Value >= floor && num.Value <= ceiling 
       num.Flag 
      select new { 
         Name = xyz.Name, 
         Value = num.Value 
         }).ToList(); 
} 

後來重構靜態變量入不同的類爲相同的查詢是由多個存儲庫comsumed,

宣言交重構如下(_filteredXyzs)駐留在同一類作爲方法使其可用於消費。

Public static IQueryable<Xyz> GetValidXyzs(Context context, int xyzTypeId) 
{ 
    return from _filteredXyzs(context, id); 
} 

當時消耗其張貼重構爲[RepositoryName]任何特定的查詢上下文內.GetValidXyzs,但具有下列 落得「System.StackOverflowException」發生在System.Data.Linq.dll」

Xyz實體基於頂部,其可用性由主表中其他類型的標誌確定。由於在許多地方使用Xyz,爲了獲得更好的性能,我對該查詢進行了預編譯,只是想集中這個方面,使其更易於維護。

當我逐步調試時,靜態方法在沒有任何錯誤的情況下退出,但在下一步即退出,即加入和評估失敗。所以我有點難以解決如何解決這個問題?

我錯別​​字&任何其他不正確的推論就我所知WRT C#遺憾和LINQ是有限的,

PS:在阿里納斯Linq2Action建議靜態字段與非靜態方法

任何幫助將不勝感激

+0

什麼是完整的簽名?提供關於如何將代碼組織到單獨的類和方法中的更多細節。 – 2009-11-28 16:13:01

回答

0

除了一些古怪的語法(在查詢表達式是where代替Where,我不知道爲什麼你有[Id])我認爲應該是好的。無可否認,我對編譯查詢沒有太多經驗,但絕對值得一試。畢竟,LINQ被設計成可組合的。

你試過了嗎?如果您有任何問題,請將其編輯到問題中,以便我們嘗試解決它們。

編輯:響應「這個作品時定義在同一個類中,但不是當在外部定義」這聽起來像你仍然試圖稱它,就好像它在同一類。這是一種方法,就像調用任何其他方法一樣調用它 - 如果是靜態方法,則使用類型名稱,否則使用引用。

+0

抱歉,錯誤,當靜態聲明是在同一個類中,但不在外部時它工作。 是否有任何其他出路使查詢更可重用? – kalki 2009-11-28 14:03:30