2017-09-28 101 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連接」 –