我正在尝试使用linq在c#for Windows Mobile 7中创建一个查询,该查询将删除表中前10个高分的所有内容。表Scores很简单,包含highScore_ID(int),highScore(int)和playerName(string)。
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查询时遇到错误,我们非常感谢任何建议。
答案 0 :(得分: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();
答案 1 :(得分:1)
如果您通常使用EF,则不支持批量删除,但如果您在类似问题中看到Alex James answer,则可以执行以下操作:
var query = Scores.OrderBy(x=>x.HighScore).Skip(10);
query.Delete();
正如你在他的回答中所看到的,你应该自己编写删除扩展方法,但他提供了所有其他方法(如工厂方法,GetQueryInfo,...)。只有部分是Delete方法,可以像Update方法一样编写,在这部分你应该编写自己的GetDeleteCommand
,它应该返回字符串like update one,但有一点变化:
command.CommandText = string.Format(
"Delete From {0} WHERE {1} IN ({2})",
info.TableName,
Context.Keys[0],
info.RestrictingSQL
);
有关包含delete的扩展方法,请参阅here,
同样,Mark说你可以通过简单的存储过程来完成所有这些:)