2009-05-06 17 views
1

私はSolutionテーブルに加わるQuestionテーブルを持っています。解決策は質問にリンクされていますが、質問を削除するには、まずその質問の解決策を削除してから、質問自体を削除する必要があります。Linq Delete over Join

特定の質問のすべてのソリューションを取得するlinqクエリがありますが、ソリューションの削除を続行する方法がわからないため、質問を削除します。ここで

がコードである、それは過負荷エラーメッセージをrecieves:

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

、あなたの質問とソリューション間の外部キー関係を持っている場合は削除が伝播されるように、それを設定します(カスケード・オン・デリート)。そうすれば、質問を削除するだけで済み、ソリューションはデータベースによって自動的に削除されます。

外部キーの関係を使用すると、関連するソリューションエンティティを直接ロードし、常に結合ロジックを作成しないようにするエンティティを質問エンティティに設定できます。デザイナーが外部キーの関係を追加した後に、エンティティを削除して再追加する必要があります。デザイナーで手作業で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>ではないという問題があります。あなたのコードがコンパイルされていても驚かれるでしょう。 LINQの式の結果は、4つのソリューションと可算である

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

:あなたが必要なもの

は(例はLINQ2Objectsを使用していますが、それは違いはありません)これで、PQST。この列挙は、あなたのDeleteOnSubmitメソッドに与えることができます。

+0

私は恐れていませんでした...... ...... – Goober

+0

ええ、ok。私は完全な例を試してみよう。たぶんどこかに違いがあるかもしれません。 –

+0

私は完全な例を追加しました... –