2

我正在尝试使用 linq 在 c# 中为 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)

林克:

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 ......)。只有一部分是 Delete 方法,可以像 Update 方法一样编写,在这部分你应该编写你自己的GetDeleteCommand,它应该返回字符串,如 update one有一点变化:

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

有关包含删除的扩展方法,请参见此处,...

同样正如马克所说,您可以使用简单的存储过程来完成所有这些工作:)

PS:阅读Alex文章的第1、2、3、4部分

于 2012-04-29T21:32:50.217 回答