2017-09-28 6 views
1

私はいくつかのフィールドを含むDBを持っています。 1つのフィールド( "フル")に基づいて重複を削除したい - つまり、複数のバージョンがある場合、それらのどれかを最初に取って残りを破棄する必要があります...SQLite DBから重複を削除する方法 - ENtityとLINQを使用して

これまでのところすべてが何らかのエラーを投げる。

これは私のタイヤの一つです。残念ながら、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()を選択できないようです。


UPDATE:今のところ私は答えhereに基づいて、単純なExecuteSqlCommandを実装しました。誰がエンティティ/ LINQでそれを行う方法を知っている場合は

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

- 。代わりトンの

+0

例外メッセージには何が表示されますか? – mm8

+0

@ mm8 SQLiteで重複を削除する一般的な方法はありますか?もしそうなら、私は単に文字列を使用してコマンドを実行します。 –

答えて

0

は=> 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結合はサポートされていません" –

関連する問題