2017-09-28 69 views
1

我有一个DB,其中包含几个字段。我想删除基于一个字段(“完整”)的重复 - 即如果有多个版本,我应该采取任何/第一个,并丢弃其余的...如何从SQLite数据库删除重复 - 使用ENtity和LINQ

到目前为止,我可以 - 所有事情都会引发某种错误。

这是我的一个轮胎。不幸的是,最后在distinctList中选择了一个错误。

using (var context = new JITBModel()) 
{ 
    var allList = context.BackupEvents.Select(i => i.Id).ToList(); 

    var distinctList = context.BackupEvents 
     .GroupBy(x => x.Full) 
     .Select(i => i.ToList()) 
     .Where(c => c.Count > 1) 
     .Select(t => t[0].Id).ToList(); 

    var dups = allList.Except(distinctList); 

    context.BackupEvents.RemoveRange(from e in context.BackupEvents 
            where dups.Contains(e.Id) 
            select e); 
    context.SaveChanges(); 

} 

此外,似乎无法在选择查询中选择.First()。


UPDATE:现在我实现了一个基于答案here简单ExecuteSqlCommand。

string com = @"DELETE FROM BackupEvents 
      WHERE rowid NOT IN (
      SELECT MIN(rowid) 
      FROM BackupEvents 
      GROUP BY full)"; 
context.Database.ExecuteSqlCommand(com); 

如果有人知道如何与实体/ LINQ做 - 让我知道:-)

+0

什么是异常消息说? – mm8

+0

@ mm8是否有一种通用的方法来删除SQLite中的重复项?如果是这样,我只会使用字符串并执行一个命令。 –

回答

0

,而不是T => T [0] .ID,尝试t.FirstOrDefault()标识。

下面的代码可能工作吗?我没有运行它,但我没有得到任何使用类似于下面的东西的预编译错误。

using (var context = new JITBModel()) 
{ 


    var duplicates= context.BackupEvents 
    .GroupBy(x => x.Full) 
    .Where(grp => grp.Count() > 1) 
    .Select(grp=>grp.FirstOrDefault()); 

    context.BackupEvents.RemoveRange(duplicates); 
    context.SaveChanges(); 

} 
+0

RemoveRange的内部异常(查询的实际执行):“不支持APPLY连接” –