为什么 linq-2-sql 会创建额外的不必要的对象?

2023-12-24

我在数据库中有一个简单的父子表,如下所示

CREATE TABLE [Parent](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](256) NOT NULL)    
ALTER TABLE [Parent] ADD CONSTRAINT [PK_Parent_Id] PRIMARY KEY ([Id])    

CREATE TABLE [Child](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [ParentId] [int] NOT NULL,
    [Name] [nvarchar](256) NOT NULL)    
ALTER TABLE [Child] ADD CONSTRAINT [PK_Child_Id] PRIMARY KEY ([Id])
ALTER TABLE [Child] ADD CONSTRAINT [FK_Child_Parent_ID] 
    FOREIGN KEY([ParentId]) REFERENCES [Parent] ([Id])

我的数据是

父表

Id  Name
1   John

子表

Id ParentId  Name
1     1    Mike
2     1    Jake
3     1    Sue
4     1    Liz

这些表映射到Parent and Child在 Visual Studio 中使用 Linq-2-SQL 设计器的 C# 对象,不带非标准选项。

我做了一个简单的测试程序来查询所有孩子及其父母

public partial class Parent
{
    static int counter = 0;
    //default OnCreated created by the linq to sql designer
    partial void OnCreated()
    {
        Console.WriteLine(string.Format("CreatedParent {0} hashcode={1}",
            ++counter , GetHashCode()));
    }
}

class Program
{
    static void Main(string[] args)
    {
        using (var db = new SimpleDbDataContext())
        {
            DataLoadOptions opts = new DataLoadOptions();
            opts.LoadWith<Child>(c => c.Parent);
            db.LoadOptions = opts;
            var allChildren = db.Childs.ToArray();
            foreach (var child in allChildren)
            {
                Console.WriteLine(string.Format("Parent name={0} hashcode={1}",
                    child.Parent.Name, child.Parent.GetHashCode()));

            }
        }
    }
}

上述程序的输出是

CreatedParent 1 hashcode=53937671
CreatedParent 2 hashcode=9874138
CreatedParent 3 hashcode=2186493
CreatedParent 4 hashcode=22537358
Parent name=John hashcode=53937671
Parent name=John hashcode=53937671
Parent name=John hashcode=53937671
Parent name=John hashcode=53937671

正如你所看到的Parent对象是为每个创建的Child在数据库中最终只会被丢弃。

问题:

  1. 为什么 Linq-2-Sql 会创建这些不必要的额外内容Parent物体?
  2. 是否有任何选项可以避免创建额外的Parent物体?

这是该方法的副作用,LoadWith已实施。 LINQ to SQL 在内部将您的查询转换为:

from c in children
select { Child = c, Parent = c.Parent }

正如您所看到的,我们为每个子级加载一次父级(内部联接)。由于恒等映射的原因,这种效果通常不可见。 ORM 确保实体对象永远不会被(表、主键)重复。当您进行更新时,这会派上用场。

LINQ to SQL 读取从服务器返回的结果集(它包含 N 次相同的 Parent!)并将其具体化为对象。仅在实现完成后,身份映射才会完成其工作并丢弃重复的父实例。

相同的效果适用于多次返回同一实体的所有查询。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 linq-2-sql 会创建额外的不必要的对象? 的相关文章

  • 使用 POST 的 HttpWebRequest 的性能

    我有一个用于测试网络服务的小工具 它可以使用 POST 或 GET 调用 Web 服务 使用POST的代码是 public void PerformRequest WebRequest webRequest WebRequest Creat
  • CMake(Ninja 后端)使用 /MT 编译

    我有一个类似的问题CMake 使用 MT 而不是 MD 进行编译 https stackoverflow com questions 14172856 cmake compile with mt instead of md但有一些差异 我正
  • 从结构调用 C++ 成员函数指针

    我找到了有关调用 C 成员函数指针和调用结构中的指针的信息 但我需要调用结构内部存在的成员函数指针 但我无法获得正确的语法 我在类 MyClass 的方法中有以下代码片段 void MyClass run struct int MyClas
  • 获取列表框中视图中的项目

    我有一个 ListBox 其属性 VirtualizingStackPanel VirtualizationMode 设置为 回收 我正在绑定一个自定义集合 实现IList and IList
  • 如何在 C# 中以编程方式将行添加到 DataGrid?

    正如标题所述 我正在尝试使用 C 以编程方式将行添加到 DataGrid 但我似乎无法使其工作 这是我到目前为止所拥有的 I have a DataGrid declared as dg in the XAML foreach string
  • Windows Phone 7 - ScrollViewer 值已更改

    我一直在寻找解决方案 但无法找到正确的解决方案 我的网格宽度为 960 并且有ScrollViewer在里面 现在我想知道滚动时滚动的值 水平偏移 我找到的所有解决方案都是针对 wpf silverlight 的 它对我不起作用 Edit
  • 维护 VS Test Project 中单元测试方法之间的上下文

    我想按顺序运行以下单元测试 使用随机数字的名称 密码等创建新客户 检索刚刚创建的客户并断言其属性包含相同的随机数 对同一用户调用 ForgotPassword 函数 并使用相同的随机数作为用户名 清楚地看到 我需要生成一次随机数 并在 3
  • 加载 QPixmap 数据的更好方法

    更好的方法来做到这一点 没有QImage QImage image width height QImage Format RGB888 memcpy image bits m frameRGB gt data 0 height width
  • 如何在 C++ 中正确使用 cin.fail()

    我正在编写一个程序 从用户那里获取整数输入cin gt gt iUserSel 如果用户输入一个字母 程序就会进入无限循环 我试图用下面的代码来阻止这种情况 但程序进入无限循环并打印出 错误 输入 我该如何修复我的程序 cin gt gt
  • 更改私有模块片段是否会导致模块重新编译?

    On 此页面有关 C 20 模块功能 https www modernescpp com index php c 20 modules private module fragment and header units 我发现了这样的说法 借
  • 如何从 Powerpoint 2010 导出电影?

    如何使用 MS Office PIA 主互操作程序集 或其他方式以编程方式将嵌入视频从 powerpoint 2010 导出到外部文件 在演示文稿中嵌入视频是 Powerpoint 2010 中的一项新功能 我找不到解决方案 PPTX 文件
  • 使用任一默认捕获模式时,这是通过复制捕获还是 (*this) 通过引用捕获?是一样的吗?

    当我看到以下工作时我有点困惑 struct A void g void f g 但后来我发现this https stackoverflow com a 16323119 5825294答案非常详细地解释了它是如何工作的 本质上 它归结为t
  • MINIX内部碎片2

    我正在用 C 语言编写一些软件 它递归地列出给定目录中的所有文件 现在我需要计算出内部碎片 我花了很长时间研究这个问题 发现 ext2 上的内部碎片只发生在最后一个块中 我知道理论上你应该能够从索引节点号获得第一个和最后一个块地址 但我不知
  • 在 clang 中向量化函数

    我正在尝试根据此用 clang 对以下函数进行矢量化铿锵参考 http llvm org docs Vectorizers html 它采用字节数组向量并根据以下条件应用掩码this RFC https www rfc editor org
  • 如何在 Hibernate 中使用 SELECT 进行 INSERT

    我需要在休眠中实现以下请求 insert into my table max column values select max id from special table where 如何在休眠中使用注释来做到这一点 Special tab
  • 在多线程环境中捕获信号

    我有一个大型程序 需要尽可能具有弹性 并且有大量线程 我需要捕获所有信号SIGBUS SIGSEGV 并在必要时重新初始化有问题的线程 或者禁用该线程以继续减少功能 我的第一个想法是做一个setjump 然后设置信号处理程序 可以记录问题
  • 批准后使用 jenkinsfile 构建促销

    仅当更改管理使用 servicenow 更改票证或通过手动批准批准它时 我才需要使用 jenkins 文件将我的构建升级到生产 我想要类似的东西 产品构建只有在经理批准后才能手动触发 他 她应该收到带有批准 拒绝链接的批准邮件 或者 如果与
  • C++ 中的析构函数

    我的 AB h 文件中有一个构造函数 class AB private int i public AB i 0 constructor AB i 0 destructor virtual void methodA unsigned int
  • java有类似C#的属性吗? [复制]

    这个问题在这里已经有答案了 C 属性 我的意思是 get 和 set 方法 是一个非常有用的功能 java 也有类似 C 的属性吗 我的意思是我们如何在 java 中实现类似以下 C 代码的内容 public string Name get
  • 将同步 zip 操作转换为异步

    我们有一个现有的库 其中一些方法需要转换为异步方法 但是我不确定如何使用以下方法执行此操作 错误处理已被删除 该方法的目的是压缩文件并将其保存到磁盘 请注意 zip 类不公开任何异步方法 public static bool ZipAndS

随机推荐

  • 为什么 FileInputStream read() 方法在进入无限循环时错误地读取问号(ascii: 63)?

    网站上有一些类似的问题 但都在不同的场景中使用过 所以 我在这里问 package Assign6B import java io FileInputStream import java io FileOutputStream import
  • Julia:文档字符串和 LaTeX

    朱莉娅有docstrings功能 记录在此处https docs julialang org en stable manual documentation https docs julialang org en stable manual
  • 动态地将事件处理程序添加到 React.DOM 元素

    我正在使用 RadioButtonGroup 组件 它类似于无线电输入但带有按钮 如果使用该组件像这样简单就好了 var SelectThing React createClass render function render I woul
  • 使用 RedBean PHP 清空或截断表?

    我使用 RedBean PHP 进行测试 我非常喜欢它 但是我不知道如何截断表 我可以获取所有豆子并删除它们 但这看起来很麻烦 在 RedBean 1 3 中 您可以使用 R wipe type 来截断表
  • 在函数内部定义全局变量

    像python一样可以在函数内定义全局变量吗 例如 在Python中 def testFunc global testVar testVar 1 有没有办法在函数内的 javascript 中定义 testvar 全局 简单地忽略var关键
  • 在 Imagemagick 中创建空白图像

    如何通过命令行在 Imagemagick 中创建空白的新图像 Using background不起作用 convert size 800x800 background white x png convert no images define
  • Seaborn 头衔位置

    我的图表标题的位置在这方面很糟糕jointplot 我试过移动loc left right and center但它不会从它所在的位置移动 我也尝试过类似的方法ax title set position 3 15 基于该网站的其他建议 但这
  • 为什么 qsort 中的排序方法改变了我的数组?

    https phaxis org 2012 07 12 get sorted index orderting of an array https phoxis org 2012 07 12 get sorted index ordertin
  • 使用 Spring 解码主体参数

    我正在使用 Spring 为 Slack 应用程序开发 REST API 后端 我能够从 Slack 接收消息 斜线命令 但无法正确接收组件交互 按钮单击 The 官方文档 https api slack com docs message
  • 批量回显 URL

    编辑 变量没有正确定义 我不知道为什么 但我找到了解决方法 只需要 6 页 我创建了第 7 页 它将立即返回到第 1 页 因此不再需要 HTMLNxtpg 变量 我正在尝试创建一个批处理文件 它将生成一个 HTML 文件 这样用户就不需要任
  • 寻找干净的 C# WinForms MVC 教程 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 如何创建丰富的用户界面 Windows 应用程序 例如 Photo Shop 我正在寻找使用 C 的 WinForms 的干净 MVC 教
  • 哪个最适合数据存储结构/类?

    我们在 SO 中看到了很多关于 c 中的类与结构的讨论 大多以结论说它是一个结束堆 栈内存分配 并建议在中使用结构小数据结构 现在我面临着在这两个选择中决定简单数据存储的情况 目前 在我们的应用程序中 我们有数千个类 仅充当简单的数据存储
  • CodeIgniter 辅助函数可以使用数据库函数吗?

    我的 CodeIgniter 控制器函数之一需要调用递归函数作为其功能的一部分 如果我将函数调用放在控制器类中 函数调用就会阻塞 并且它无法访问数据库函数 this gt db gt get 如果我把它放在课堂之外 让它成为辅助函数可以解决
  • 在 UISlider 下添加数字

    我有一个用它实现的 UISliderJQuery UI 我想在显示数字的滑块下添加一个图例 我跟着这个答案 https stackoverflow com a 16877678 4861207它展示了如何实现这一点 然后将数字与百分比值一起
  • Rails:在任何来源中都找不到 minitest-4.7.5

    这里有一个麻烦 在我的远程服务器命令上gem list shows some gems minitest 4 7 5 bundle show minitest命令显示 var lib gems 1 9 1 gems minitest 4 7
  • Javascript:如何重用创建子实例的方法而不创建循环依赖项

    abstract class Fruit private content Fruit addChild Pick one at random using this as an example instead of the actual cr
  • 使用 jquery 从 获取复选框值

    http ghinda net css toggle switch bootstrap html http ghinda net css toggle switch bootstrap html 我使用上面的 css 文件和代码来制作切换开
  • Keras - 历元相关损失函数

    我正在使用 Keras 框架 我想实现一个与纪元相关的损失函数 即每个纪元的损失函数都不相同 你会怎么做 您能否添加一个示例 例如基于keras VAE 教程 https github com fchollet keras blob mas
  • iOS 设备 UDID 区分大小写吗?

    这是关于将设备添加到配置门户以进行临时测试 一个客户给我发了一个带有大写字符的 UDID 我没有检查就愚蠢地添加了它 无线部署不起作用 我想知道这是否是原因 但我想在用完我的 100 个分配之一之前先检查一下 Yes UDIDs区分大小写
  • 为什么 linq-2-sql 会创建额外的不必要的对象?

    我在数据库中有一个简单的父子表 如下所示 CREATE TABLE Parent Id int IDENTITY 1 1 NOT NULL Name nvarchar 256 NOT NULL ALTER TABLE Parent ADD