2009-01-23 78 views
3

使用LINQ to SQL查詢反對的LINQ to SQL關係

SELECT [t1].[ID], [t1].[CategoryID], [t1].[Name], [t1].[Price], [t1].[Descripti 
n], [t1].[IsFeatured], [t1].[IsActive] 
FROM (
    SELECT ROW_NUMBER() OVER (ORDER BY [t0].[ID], [t0].[CategoryID], [t0].[Name 
, [t0].[Price], [t0].[Description], [t0].[IsFeatured], [t0].[IsActive]) AS [ROW 
NUMBER], [t0].[ID], [t0].[CategoryID], [t0].[Name], [t0].[Price], [t0].[Descrip 
ion], [t0].[IsFeatured], [t0].[IsActive] 
    FROM [dbo].[Products] AS [t0] 
    WHERE [t0].[ID] = @p0 
    ) AS [t1] 
WHERE [t1].[ROW_NUMBER] BETWEEN @p1 + 1 AND @p1 + @p2 
ORDER BY [t1].[ROW_NUMBER] 
-- @p0: Input Int (Size = 0; Prec = 0; Scale = 0) [1] 
-- @p1: Input Int (Size = 0; Prec = 0; Scale = 0) [1] 
-- @p2: Input Int (Size = 0; Prec = 0; Scale = 0) [1] 

它使用分頁ROW_NUMBER ...良好的執行。

現在,我試圖使用由LINQ to SQL生成的關係來分頁數據。使用查詢...

var cat = db.Categories.Where(c => c.ID == 1).SingleOrDefault(); 
cat.Products.Where(c => c.ID == 1).Skip(1).Take(1).ToList(); 

SELECT [t0].[ID], [t0].[Name] 
FROM [dbo].[Categories] AS [t0] 
WHERE [t0].[ID] = @p0 
-- @p0: Input Int (Size = 0; Prec = 0; Scale = 0) [1] 
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 3.5.30729.1 

SELECT [t0].[ID], [t0].[CategoryID], [t0].[Name], [t0].[Price], [t0].[Descriptio 
n], [t0].[IsFeatured], [t0].[IsActive] 
FROM [dbo].[Products] AS [t0] 
WHERE [t0].[CategoryID] = @p0 
-- @p0: Input Int (Size = 0; Prec = 0; Scale = 0) [1] 
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 3.5.30729.1 

現在使用ROW_NUMBER和分頁的走了......它讓所有的產品,其中類別ID = 1 ...爲什麼會得到所有行?

+0

我同意它看起來很奇怪。 – jcollum 2009-01-23 23:15:41

回答

2

我認爲它是因爲該類別在內存中。您隱含地要求獲取該類別的產品。這種對數據的隱式請求用於填充,然後在內存中(類別在此處)執行查詢。

我想它等同於:

var cat = db.Categories.Where(c => c.ID == 1).SingleOrDefault(); 
var prods = db.Products.Where(c => c.ID == 1).ToList(); 
var r = prods.Where(p.CategoryID == cat.ID).Skip(1).Take(1); 

注意義內存,如果有什麼貓的變化?收藏的大小可能會有所不同。

注意:感謝您的頭痛:)

+1

基本上,作爲集合存在的關係顯然總是在查詢時加載爲整個集合。對不起,頭疼,也讓我瘋了。 – 2009-01-24 06:54:11

0

你嘗試過:

var cat = db.Categories.Where(c => c.ID == 1); 
var prod = cat.Products.Where(c => c.ID == 1).Skip(1).Take(1).ToList(); 
-1

你還沒有指定你的第二個LINQ查詢的輸出。所以'貓'仍然只是第一個查詢。

+0

輸出並不重要,您錯過了這一點。 – 2009-01-24 01:47:35