找到丢失的外键

时间:2012-05-07 19:54:08

标签: c# linq linq-to-sql

好吧,我觉得这个很容易。我在tblWorkoutstblPersonalRecords之间存在一对多的关系。我现在已经从tblWorkouts删除了一些行而没有从tblPersonalRecords删除它们(我应该设置一个外键和一个级联删除...)。

我正在尝试找出一个查询来查找tblPersonalRecords中的孤立行。这是我试过的:

from s in db.tblPersonalRecords
where s.tblWorkoutRecord.WorkoutSummaryID == null
select s

这不起作用。如何编写LINQ查询以查找我的孤立行?如果有所作为,我正在使用Linq2Sql。

3 个答案:

答案 0 :(得分:3)

阅读您对可能需要的问题的评论:

from s in db.tblPersonalRecords
where !db.PersonalWorkout.Any(x => s.WorkoutRecordID == x.WorkoutRecordID)
select s

答案 1 :(得分:3)

也许我误解了这个问题但是为什么在从tblWorkouts中删除行后没有更新行时,你会检查tblPersonalRecords中的值是否为空?

我希望现在的外键值现在指向tblWorkouts中不再存在的行而不是null。

如果是这种情况,那么这样的事情会有所帮助:

var ids = from w in db.tblWorkouts
          select w.id;

var rows = from s in db.tblPersonalRecords
           where !ids.Contains(s.tblWorkoutRecord.WorkoutSummaryID)
           select s;

无论如何,如果您的原始声明,编译器会抱怨什么?你得到什么类型的错误?

答案 2 :(得分:0)

这是有用的:

var result = from s in db.tblPersonalRecords
                         join j in db.tblWorkoutRecords on s.WorkoutRecordID equals j.WorkoutRecordID into PersonalWorkout
                         from j in PersonalWorkout.DefaultIfEmpty()
                         where j == null
                         select new
                         {
                             PersonalRecordID = s.PersonalRecordID,
                             WorkoutRecordIDPR = s.WorkoutRecordID,
                             WorkoutRecordID = j == null ? 0 : 1
                         };