【问题标题】:Querying against LINQ to SQL relationships查询 LINQ to SQL 关系
【发布时间】:2010-10-03 06:22:03
【问题描述】:

使用 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]

它使用 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 和分页了...它获取了 CategoryID = 1 的所有产品...为什么它会获取所有行?

【问题讨论】:

    标签: asp.net sql linq linq-to-sql


    【解决方案1】:

    你试过了吗:

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

    【讨论】:

      【解决方案2】:

      您尚未分配第二个 LINQ 查询的输出。所以 'cat' 仍然只是第一个查询。

      【讨论】:

        【解决方案3】:

        我认为是因为类别在内存中。您隐含地要求它获取该类别的产品。这个对数据的隐式请求是为了填充,然后在内存中(此时类别所在的位置)执行查询。

        我认为它相当于:

        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);
        

        注意意义,如果 cat 内存发生变化怎么办?集合的大小可能会有所不同。

        注意:感谢您的头痛:)

        【讨论】:

        • 基本上作为集合存在的关系在查询时总是作为整个集合加载。很抱歉让我头疼,也让我发疯了。
        • 说得好。没问题,这绝对是我需要弄清楚的事情!
        猜你喜欢
        • 2023-04-06
        • 1970-01-01
        • 2010-12-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多