2009-01-23 80 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