C# 在C中使用linq导入数据的有效方法#

C# 在C中使用linq导入数据的有效方法#,c#,sql,linq,collections,C#,Sql,Linq,Collections,我有一些对象的集合,这些对象来自一个特定的类 现在我想用Linq导入此集合。 我知道使用Linq导入数据的原理 我的问题是,当我导入这个对象集合时,例如,数据库中的两个表与foreignkey连接,然后一些对象将共享同一个foreignkey,在一个表中首次导入是否对性能和扩展更好,从该导入中获取ID并使用该ID更新客户端上的集合,或者将导入数据中的ID保留在其他集合中,并始终检查该集合中的下一个对象 或者使用Linq和导入到多个不同表中的集合的最佳解决方案是什么 哪些是。。。数据库中使用外键连

我有一些对象的集合,这些对象来自一个特定的类

现在我想用Linq导入此集合。 我知道使用Linq导入数据的原理

我的问题是,当我导入这个对象集合时,例如,数据库中的两个表与foreignkey连接,然后一些对象将共享同一个foreignkey,在一个表中首次导入是否对性能和扩展更好,从该导入中获取ID并使用该ID更新客户端上的集合,或者将导入数据中的ID保留在其他集合中,并始终检查该集合中的下一个对象

或者使用Linq和导入到多个不同表中的集合的最佳解决方案是什么

哪些是。。。数据库中使用外键连接的两个表

这看起来像一种关系:一个表中的外键引用另一个表的主键

例如,一所学生众多的学校。如果使用主键[10]的学生使用主键[8]上学,则学生[10]有一个值为[8]的外键学校ID

你还写道:

。。。然后一些对象将共享相同的外键

这有点令人困惑。似乎您的意思是,两个表中的项有一个外键,即引用第三个表中项的同一主键

例如:如果学生[10]上学[8],而教师[25]在学校[8]任教,那么学生和教师都将拥有一个值为[8]的外键SchoolId

您的问题是,什么效率更高:使用两个查询从表中获取数据,然后将它们组合起来,或者让数据库在一个查询中执行此操作

数据库经过了极大的优化,可以组合来自表的记录,特别是当这些记录使用外键相互引用时。较慢的部分之一是将查询数据从数据库管理系统传输到本地进程

因此,只传输您实际计划使用的记录的属性是明智的

现在您似乎有两个表,其中所有记录都有一个外键,指向第三个表中项目的主键,就像我的学校、教师和学生示例一样

通常情况下,你会询问那些;每个学校都有老师。。。它的学生说

你可能不想要学校、老师和学生的所有财产。似乎你不想要任何学校财产,只有一些教师财产和学生财产

由于您希望将具有特定学校ID的学生与具有相同学校ID的教师进行匹配,因此明智的做法是不要将此外键传递两次:一次传递给学校的学生[8],一次传递给学校的教师[8],因为他们在同一所学校,您知道他们将具有相同的价值观

另一个优化:如果在学校[8]有几个学生,在学校[8]有几个老师,为什么不进行以下查询:

给我所有的学校的钥匙(可能还有一些其他的财产),连同所有在这所学校上学的学生的一些财产,以及所有在这所学校教书的老师的一些财产


因此,您知道Id为[8]的学校将拥有所有具有值为[8]的外键的学生和所有具有值为[8]的外键的教师。

您的标题确实具有误导性。Linq不导入/导出数据,它几乎只能转换数据。这不是我的意思。也许我写这篇文章是为了让别人难以理解问题所在。我收集了一些物品。让我们以你们学校为例。在模具收藏中,则是学生和学校的物品。数据库中既没有学生也没有学校。集合中的对象包括:学生姓名;学校名称。然后我想导入它们。所以我必须先引进新学校,然后再引进学生。最好的方法是什么?首先创建学校,然后用id更新集合中的特技演员?
var results = dbContext.Schools
    .Select(school => new
    {
        Id = school.Id,
        Name = school.Name,        // only if you want other School properties
        ...

        // All Students that attend this School
        // == that have a foreign key equal to School.Id
        Students = dbContext.Students.Select(student => new
        {
            // Select only the properties that you plan to use
            Id = student.Id,
            Name = student.Name,
            ...

            // not needed: you know the value:
            // SchoolId = student.SchoolId,
        })
        .ToList(),

        // all Teachers that teach on this School
        // == that have a foreign key equal to School.Id
        // == that have a foreign key equal to the foreign key of all Students on this School
        Teachers = dbContext.Teachers.Select(teacher => new
        {
            // again: select only properties that you plan to use
            Id = teacher.Id,
            Name = teacher.Name,
            ...

            // not needed: you know the value:
            // SchoolId = teacher.SchoolId,

        })
        .ToList(),
    });