2011-04-08 17 views
4

我有一個很好的編譯查詢。我將它傳遞給product_id,它返回該產品的產品評論信息。我可以在第二個查詢中使用已編譯的查詢作爲源嗎?

是否有可能使用此編譯查詢作爲子查詢的來源?例如:

from cat in ctx.cat_table 
join prod in ctx.prod_table on cat.category_id equals prod.category_id 
select new 
{ 
    cat_id = cat.category_id, 
    prod_id = prod.product_id, 
    name = prod.product_name, 
    descript = prod.product_description, 
    price = prod.price, 
    reviews = (from mcq in mycompiledquery(ctx, prod.product_id) 
       select new 
       { 
        rating = mcq.review_rating, 
        review = mcq.review_text 
       }  
} 

我在做這樣的事情早期的嘗試引發錯誤:

The LINQ expression node type 'Invoke' is not supported in LINQ to Entities

一種替代方法我也想過是一個SQL視圖來代替我的編譯的查詢,但我擔心負面表現受到打擊。

非常感謝您提供的任何建議。

回答

2

您可以使用編譯的查詢在其他查詢,但不能使其依賴於外部查詢。實例

// You can do 
var someParams = 10; 
var dataQuery = from x in ctx.SomeData 
       join y in myCompiledQuery.Invoke(ctx, someParams) 
        on x.Id equals y.Id 
       where x.Name = "ABC" 
       select new { x, y }; 

// You can't do - this example will not compile but let's use it for description 
var dataQuery = from x in ctx.SomeData 
       join y in myCompiledQuery.Invoke(ctx, x.SomeParams) 
        on x.Id equals y.Id 
       where x.Name = "ABC" 
       select new { x, y }; 

不同的是,第一個例子只是執行委託(編譯的查詢是一個代表),並返回IQueryable。第二個示例無法執行委託,因爲它依賴於外部查詢數據,因此它將其作爲必須添加到表達式樹中並在查詢執行過程中進行整理的內容。這會失敗,因爲EF提供程序無法轉換委託調用。

+0

謝謝你有道理。我讚賞直截了當的比較。 – karman 2011-04-10 03:31:23

0

你可以合併和嵌入查詢,但我不認爲你可以使用編譯查詢。但它確實無關緊要,因爲EF只會編譯一次合併查詢,然後將其緩存(並且數據庫後端應緩存關聯的查詢計劃)。

你可以因此使用的東西沿着這些路線:

var reviewQuery = from mcq in reviews 
        select new 
        { 
         prod_id = mcq.prod_id 
         rating = mcq.review_rating, 
         review = mcq.review_text 
        }; 

from cat in ctx.cat_table 
join prod in ctx.prod_table on cat.category_id equals prod.category_id 
select new 
{ 
     cat_id = cat.category_id, 
     prod_id = prod.product_id, 
     name = prod.product_name, 
     descript = prod.product_description, 
     price = prod.price, 
     reviews = from r in reviewQuery where r.prod_id == prod_id select r 
} 
+0

感謝Morten。這可能是我最好的選擇。 – karman 2011-04-11 19:10:19

相關問題