2011-11-17 52 views
0

我很新的OData(僅開始在網站上昨天),所以請原諒我,如果這個問題太愚蠢:-)如何使用字典或哈希表的LINQ查詢性能OData服務下

我有構建了一個測試項目作爲概念驗證,將我們當前的Web服務遷移到OData。對於這個測試項目,我使用反射提供程序通過OData公開POCO類。這些POCO類來自內存緩存。下面是迄今爲止代碼:

public class DataSource 
{ 
    public IQueryable<Category> CategoryList 
    { 
     get 
     { 
      List<Category> categoryList = GetCategoryListFromCache(); 
      return categoryList.AsQueryable(); 
     } 
    } 
    // below method is only required to allow navigation 
    // from Category to Product via OData urls 
    // eg: OData.svc/CategoryList(1)/ProductList(2) and so on 
    public IQueryable<Category> ProductList 
    { 
     get 
     { 
      return null; 
     } 
    } 
} 

[DataServiceKeyAttribute("CategoryId")] 
public class Category 
{ 
    public int CategoryId { get; set; } 
    public string CategoryName { get; set; } 
    public List<Product> ProductList { get; set; } 
} 

[DataServiceKeyAttribute("ProductId")] 
public class Product 
{ 
    public int ProductId { get; set; } 
    public string ProductName { get; set; } 
} 

據我所知,OData的是要使用LINQ幕後查詢這些內存中的對象,即:列出在這種情況下,如果有人瀏覽到的OData。 svc/CategoryList(1)/ ProductList(2)等等。

這裏雖然問題:在現實世界中的場景,我在看超過18萬條記錄,較24個不同的實體緩存中。

目前生產的網絡服務做出了很好的使用.NET字典和Hashtable的集合,以確保非常快看看UPS和避免循環的很多。因此,要獲得ProductID爲CategoryID爲CategoryID 1的產品,當前的Web服務只需執行2次查找,即:第一個查找類別,第二個查找類別內的產品。就像一棵樹。

我想知道我怎麼能遵循的OData類似的架構,我可以告訴的OData和LINQ使用字典或哈希表來定位記錄,而不是遍歷一個泛型列表?

是否有可能使用反射提供商或我留下,沒有別的選擇,只能寫我的OData的自定義提供?

在此先感謝。

回答

1

您將需要處理表達式樹,所以你需要在底層的LINQ到對象至少部分IQueryable的執行情況。爲此,您不需要一個完整的自定義提供程序,只需從上下文類的propties中返回IQueryable即可。 在這種IQueryable的你將不得不承認的「關鍵」屬性過濾器(。凡(p值=> p.ProductID = 2)),並翻譯成一個字典/散列表查找。然後,您可以使用LINQ來處理查詢的其餘部分。 但是,如果客戶端使用未觸及密鑰屬性的篩選器發出查詢,它將最終執行完整掃描。儘管如此,您的自定義IQueryable可以檢測到並且無法查詢此類查詢。

+0

太棒了......這個在你遇到過的真實世界中的任何例子?我到目前爲止在谷歌上找不到任何東西 – Raj

+0

我不知道這個公開示例。看看這個http://blogs.msdn.com/b/vitek/archive/2010/02/25/data-services-expressions-part-1-intro.aspx。它本身描述了你可能遇到的表達樹。此外,Matt的博客系列中也有關於LINQ提供商的鏈接。 –