[英]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.