2

linqを使用してWindowsMo​​bile7のc#でクエリを作成しようとしています。このクエリは、テーブルの上位10個のハイスコアを除くすべてを削除します。テーブルScoresは単純で、highScore_ID(int)、highScore(int)、およびplayerName(文字列)が含まれています。

SQL:

DELETE FROM Scores
WHERE highscore_ID NOT IN (SELECT TOP 10 highScore FROM HighScore)

LINQ:

from c in context.Scores where !((from o in context.Scores select   
o.highScore).Take(10)).Contains(c.highscore_ID) select c;

このlinqクエリでエラーが発生しているようです。提案をいただければ幸いです。

4

2 に答える 2

3

さて、最初にあなたのSQLは間違っています。これである必要があります:

DELETE FROM HighScore
WHERE highscore_ID NOT IN (
    SELECT TOP 10 highScore_ID
    FROM HighScore
    ORDER BY score DESC
) 

LINQでこれを行うには、最初に適切な行を選択してから、オブジェクトごとにDeleteObjectを呼び出します。

var query = context.Scores.OrderByDescending(x => x.HighScore).Skip(10);
foreach (var score in query) {
    context.Scores.DeleteObject(score);
}
context.SaveChanges();
于 2012-04-29T21:04:53.370 に答える
1

通常 EF を使用している場合、一括削除はサポートされていませんが、同様の質問でAlex James の回答が表示された場合は、次のことができます。

var query = Scores.OrderBy(x=>x.HighScore).Skip(10);
query.Delete();

彼の回答でわかるように、削除拡張メソッドを自分で作成する必要がありますが、彼は他のすべてのメソッド (ファクトリ メソッド、GetQueryInfo など) を提供しました。唯一の部分は、Update メソッドのように記述できる Delete メソッドです。この部分では、更新メソッドのような文字列を返す必要がありますが、少しバリエーションを加えて独自に記述する必要がありGetDeleteCommandます。

       command.CommandText = string.Format(
       "Delete From {0} WHERE {1} IN ({2})",
       info.TableName,
       Context.Keys[0],
       info.RestrictingSQL
       ); 

delete を含む拡張メソッドについては、こちらを参照してください...

また、マークが言ったように、単純なストアドプロシージャでこれをすべて行うことができます:)

PS: Alexの記事のパート1、2、3、4読んください。

于 2012-04-29T21:32:50.217 に答える