如何从SQLite DB中删除重复项 - 使用ENtity和LINQ

时间:2017-09-28 15:48:15

标签: c# entity-framework linq sqlite duplicates

我有一个包含几个字段的数据库。我想根据一个字段删除重复项(" full") - 即如果有多个版本,我应该接受其中的任何一个,并丢弃其余的字段......

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

这是我的一个轮胎。不幸的是,最后一次选择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()。

更新:目前我根据答案here实施了一个简单的ExecuteSqlCommand。

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

如果有人知道如何使用entity / linq - 让我知道: - )

1 个答案:

答案 0 :(得分:0)

而不是t => t [0] .Id,尝试t.FirstOrDefault()。Id。

下面的代码可能有效吗?我没有运行它,但是我没有使用类似于下面的内容获得任何预编译错误。

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();

}