【问题标题】:How to remove duplicates from SQLite DB - using ENtity and LINQ如何从 SQLite DB 中删除重复项 - 使用 ENtity 和 LINQ
【发布时间】:2018-03-10 10:44:57
【问题描述】:

我有一个数据库,其中包含一些字段。我想根据一个字段(“完整”)删除重复项 - 即,如果它有多个版本,我应该采用其中的任何一个/第一个,并丢弃其余的......

到目前为止,我还做不到 - 一切都会引发某种错误。

这是我的一个轮胎。不幸的是, distinctList 中的最后一个 Select 引发错误。

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 - 请告诉我:-)

【问题讨论】:

  • 异常信息是什么意思?
  • @mm8 有没有一种通用的方法来删除 SQLite 中的重复项?如果是这样,我将只使用字符串并执行命令。

标签: c# entity-framework linq sqlite duplicates


【解决方案1】:

尝试 t.FirstOrDefault().Id,而不是 t=> t[0].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();

}

【讨论】:

  • RemoveRange 的内部异常(查询的实际执行):“不支持应用连接”
猜你喜欢
  • 2021-08-13
  • 1970-01-01
  • 2014-11-11
  • 1970-01-01
  • 1970-01-01
  • 2019-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多