Windows Mobile 7 - C#将SQL转换为Linq,删除表中排名前10位的所有内容

时间:2012-04-29 21:02:31

标签: c# windows-phone-7 linq-to-entities

我正在尝试使用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查询时遇到错误,我们非常感谢任何建议。

2 个答案:

答案 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说你可以通过简单的存储过程来完成所有这些:)

P.S:阅读Alex的文章的1234部分。