gpt4 book ai didi

linq - 如何使用 LINQ to SQL 预先加载同级数据?

转载 作者:行者123 更新时间:2023-12-03 14:57:04 25 4
gpt4 key购买 nike

目标是在不使用匿名类型的情况下使用 LINQ to SQL 向 SQL Server 发出最少的查询。该方法的返回类型需要是 IList 。关系如下:

            Parent
Child1 Child2
Grandchild1

父 > 子 1 是一对多的关系

Child1 > Grandchild1 是一对 n 关系(其中 n 为零到无穷大)

父 > 子 2 是一对 n 关系(其中 n 为零到无穷大)

我能够预先加载 Parent、Child1 和 Grandchild1 数据,从而对 SQL Server 进行一次查询。

此带有加载选项的查询预先加载所有数据,兄弟数据 (Child2) 除外:
DataLoadOptions loadOptions = new DataLoadOptions();
loadOptions.LoadWith<Child1>(o => o.GrandChild1List);
loadOptions.LoadWith<Child1>(o => o.Parent);

dataContext.LoadOptions = loadOptions;

IQueryable<Child1> children = from child in dataContext.Child1
select child;

我还需要加载同级数据。我尝试过的一种方法是将查询拆分为两个 LINQ to SQL 查询并将结果集合并在一起(不漂亮),但是在访问同级数据时,它无论如何都是延迟加载的。

添加同级加载选项将为每个 Grandchild1 和 Child2 记录向 SQL Server 发出查询(这正是我试图避免的):
DataLoadOptions loadOptions = new DataLoadOptions();
loadOptions.LoadWith<Child1>(o => o.GrandChild1List);
loadOptions.LoadWith<Child1>(o => o.Parent);
loadOptions.LoadWith<Parent>(o => o.Child2List);

dataContext.LoadOptions = loadOptions;

IQueryable<Child1> children = from child in dataContext.Child1
select child;


exec sp_executesql N'SELECT * FROM [dbo].[Child2] AS [t0]
WHERE [t0].[ForeignKeyToParent] = @p0',N'@p0 int',@p0=1

exec sp_executesql N'SELECT * FROM [dbo].[Child2] AS [t0]
WHERE [t0].[ForeignKeyToParent] = @p0',N'@p0 int',@p0=2

exec sp_executesql N'SELECT * FROM [dbo].[Child2] AS [t0]
WHERE [t0].[ForeignKeyToParent] = @p0',N'@p0 int',@p0=3

exec sp_executesql N'SELECT * FROM [dbo].[Child2] AS [t0]
WHERE [t0].[ForeignKeyToParent] = @p0',N'@p0 int',@p0=4

我还编写了 LINQ to SQL 查询来加入所有数据,希望它能急切加载数据,但是当访问 Child2 或 Grandchild1 的 LINQ to SQL EntitySet 时,它会延迟加载数据。

返回 IList 的原因是为了补充业务对象。

我的想法是我要么:
  • 以错误的方式解决这个问题。
  • 可以选择调用存储过程吗?
  • 我的组织不应该使用 LINQ to SQL 作为 ORM?

  • 任何帮助是极大的赞赏。

    谢谢,

    -斯科特

    最佳答案

    你所拥有的应该是正确的,你需要添加这个dataContext.DeferredLoadingEnabled = false;除了您已经设置的 LoadOptions。

    关于linq - 如何使用 LINQ to SQL 预先加载同级数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2546233/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com