【发布时间】:2011-10-15 20:30:47
【问题描述】:
我有两个实体,Class 和 Student,以多对多关系链接。
当从外部应用程序导入数据时,不幸的是有些类是重复创建的。 “重复”课程名称不同,但学科相同,学生相同。
例如:
{ Id = 341, Title = '10rs/PE1a', SubjectId = 60, Students = { Jack, Bill, Sarah } }
{ Id = 429, Title = '10rs/PE1b', SubjectId = 60, Students = { Jack, Bill, Sarah } }
匹配这些重复类的名称没有通用规则,因此识别两个类重复的唯一方法是它们具有相同的SubjectId和Students.
我想使用 LINQ 检测所有重复项(并最终合并它们)。到目前为止,我已经尝试过:
var sb = new StringBuilder();
using (var ctx = new Ctx()) {
ctx.CommandTimeout = 10000; // Because the next line takes so long!
var allClasses = ctx.Classes.Include("Students").OrderBy(o => o.Id);
foreach (var c in allClasses) {
var duplicates = allClasses.Where(o => o.SubjectId == c.SubjectId && o.Id != c.Id && o.Students.Equals(c.Students));
foreach (var d in duplicates)
sb.Append(d.LongName).Append(" is a duplicate of ").Append(c.LongName).Append("<br />");
}
}
lblResult.Text = sb.ToString();
这不好,因为我得到了错误:
NotSupportedException:无法创建“TeachEDM.Student”类型的常量值。此上下文仅支持原始类型(“例如 Int32、String 和 Guid”)。
显然它不喜欢我尝试在 LINQ 中匹配 o.SubjectId == c.SubjectId。
此外,这似乎是一种可怕的方法,而且速度非常慢。调用数据库需要 5 分钟以上。
非常感谢一些建议。
【问题讨论】:
-
如果有人感兴趣,可以在 Code Review 上关注这个问题codereview.stackexchange.com/q/5396/5944
标签: c# .net linq entity-framework linq-to-entities