使用LINQ to SQL查询关系数据

3

使用LINQ to SQL

db.Products.Where(c => c.ID == 1).Skip(1).Take(1).ToList();

执行
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]

现在正在尝试使用由LINQ to SQL生成的关系来进行数据分页。 使用以下查询...

它使用ROW_NUMBER进行分页...很好。

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和分页,而是获取CategoryID = 1的所有产品...为什么会获取全部行?
3个回答

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
基本上,作为集合存在的关系在查询时显然总是作为整个集合加载。很抱歉让你头疼了,我也曾经被这个问题困扰过。 - Chad Moran
说得好。没问题,这绝对是我也需要弄清楚的事情! - ccook

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查询分配输出。所以“cat”仍然只是第一个查询。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接