2009-05-06 54 views
1

我有一个问题表,它连接到一个解决方案表。解决方案与问题相关,但为了删除问题,我必须先删除该问题的解决方案,然后删除问题本身。Linq删除加入

我有一个linq查询检索特定问题的所有解决方案,但我不知道如何继续删除解决方案,然后继续删除问题。

下面是代码,它临危超载的错误消息:

public static void DeleteSol(string qTextInput) 
{ 
    ExamineDataContext dc = new ExamineDataContext(); 
    var matchedSol = from q in dc.Questions 
          where q.QuestionText.Contains(qTextInput) 
          join s in dc.Solutions 
          on q.QuestionID equals s.QuestionID 
          into qs // note grouping   
          select new 
          { 
           solution = qs 
          }; 
    try 
    { 
     dc.Solutions.DeleteOnSubmit(matchedSol); 
     dc.SubmitChanges(); 
    } 
    catch (Exception ex) 
    { 
     throw ex; 
    } 
} 

回答

3

如果您有您的问题和解决方案之间的外键关系,只需设置它,以便删除传播(CASCADE ON DELETE)。这样你只需要删除问题,解决方案就会被数据库自动删除。

使用外键关系也会给你一个在你的Question实体上设置的实体,它将直接加载相关的Solution实体并使之成为可以避免一直写入连接逻辑。在添加设计器的外键关系后,您需要删除并重新添加实体 - 或者您可以在设计器中手动输入add the association

1

我觉得用加入是问题的根源。尝试创建问题和Soutions之间的DBML的映射,那么你就可以简单地写:

var questions = from q in Questions where q.QuestionText.Contains(qTextInput); 
var solutions = questions.SelectMany(q => q.Solutions); 
... 
dc.Solutions.DeleteAllOnSubmit(solutions); 
0

问题是matchedSol不是IEnumerable<Solution>类型。如果您的代码编译完成,我会感到惊讶。

你需要的是这个(示例使用LINQ2Objects但这并不有所作为):

static void Main() 
{ 
    var questions = new[] 
         { 
          new { QuestionID = 1, QuestionText = "ABCDEF" }, 
          new { QuestionID = 2, QuestionText = "GHIJKL" }, 
          new { QuestionID = 3, QuestionText = "ABCXYZ" }, 
         }; 
    var solutions = new[] 
         { 
          new { QuestionID = 1, Solution = "P" }, 
          new { QuestionID = 1, Solution = "Q" }, 
          new { QuestionID = 2, Solution = "R" }, 
          new { QuestionID = 3, Solution = "S" }, 
          new { QuestionID = 3, Solution = "T" }, 
          new { QuestionID = 4, Solution = "U" }, 
         }; 
    var qTextInput = "ABC"; 
    var matchedSol = from q in questions 
        where q.QuestionText.Contains(qTextInput) 
        join s in solutions 
        on q.QuestionID equals s.QuestionID 
        select s; 

    foreach (var solution in matchedSol) 
    { 
     Console.WriteLine("Solution " + solution.Solution + 
          " for question " + solution.QuestionID); 
    } 
} 

的LINQ表达式的结果是一个枚举的四个解决方案:PQST。这个枚举可以给你的方法DeleteOnSubmit

+0

恐怕没有工作...... – Goober 2009-05-06 17:27:34