繁体   English   中英

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

[英]Efficient way to import data with linq in C#

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

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

我的问题是,当我导入这个对象集合时,例如数据库中的两个表与一个外键连接,然后一些对象将共享相同的外键,对于第一次导入一个表时性能和缩放是否更好,得到来自此导入的 ID 并使用此 ID 更新客户端上的集合,或者将导入数据中的 ID 保留在例如其他集合中,并始终检查集合中的下一个 object?

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

你写了:

这是...数据库中的两个表用外键连接

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

例如,有许多学生的学校。 如果具有主键 [10] 的学生使用主键 [8] 上学,则学生 [10] 具有值为 [8] 的外键 SchoolId

你还写道:

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

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

例如:如果学生 [10] 就读于学校 [8] 并且教师 [25] 在学校 [8] 任教,则学生和教师都将具有值为 [8] 的外键 SchoolId

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

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

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

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

通常,您会查询...的学校; 每所学校都有它的老师……和它的学生……;

您可能不想要 Schools 和 Teachers and Students 的所有属性。 看来您不需要任何学校属性,只需要一些教师属性和学生属性。

由于您希望将具有特定 SchoolId 的学生与具有相同 SchoolId 的教师进行匹配,因此最好不要将此外键传递两次:一次用于学校的学生 [8],一次用于学校的教师 [8] ,因为他们在同一所学校,你知道他们将具有相同的价值。

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

给我所有...的学校,主键(可能还有其他一些属性),以及就读这所学校的所有学生的(一些属性),以及在这所学校任教的所有教师的(一些属性)

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(),
    });

在结果中,您知道 ID 为 [8] 的学校将拥有所有外键值为 [8] 的学生和所有外键值为 [8] 的教师

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM