3

私は以下のようなモデルを持っています

ID     Date                    BoitierNumber
1      07/04/2012 14:01:46     1
2      07/04/2012 14:01:50     2
3      07/04/2012 14:01:50     3
4      07/04/2012 14:01:56     1
5      07/04/2012 14:02:06     1
6      07/04/2012 14:02:10     2

(BoitierNumber) で行をグループ化しました

*boitier Number 1

 1      07/04/2012 14:01:46
 4      07/04/2012 14:01:56 
 5      07/04/2012 14:02:06

*boitier Number 2

 2      07/04/2012 14:01:50
 6      07/04/2012 14:02:10 

*boitier Number 3

 3      07/04/2012 14:01:50

これを行うには、このコードを使用しました

var groups = context.Essais.GroupBy(p => p.BoitierNumber)
                .Select(g => new { GroupName = g.Key, Members = g });

foreach (var g in groups)
{
    Console.WriteLine("Members of {0}", g.GroupName);

    foreach (var member in g.Members.OrderBy(x=>x.Id))
    {
        Console.WriteLine("{0}     {1}", member.Id,member.Date);
    }
}

現時点では、すべてが正常に機能するようになりました。行[i].date>行[i-1].dateの場合、グループ化された2つの連続する行の日付を比較したい場合、行[i-1]を削除します

例えば:

*boitier Number 1

 1      07/04/2012 14:01:46
 4      07/04/2012 14:01:56 
 5      07/04/2012 14:02:06 
 8      07/04/2012 14:01:00 
 10     07/04/2012 14:00:00 
 13     07/04/2012 14:03:00 
 boitier Number 1 
 ---> Date of row of Id 4 > Date of row of ID 1
 then i will delete row of ID 1
 ---> Date of row of Id 5 > Date of row of ID 4
 then i will delete row of ID 4
 ---> Date of row of Id 8 < Date of row of ID 5
 then i will skip it
 ---> Date of row of Id 10 < Date of row of ID 8
 then i will skip it
 ---> Date of row of Id 13 > Date of row of ID 10
 then i will delete row of ID 10
 ...

 TherFore, After this process, only rows 13 and 8 will be remain 
4

1 に答える 1

3

今できる最速の変更は次のとおりです。

var groups = context.Essais.GroupBy(p => p.BoitierNumber)
                .Select(g => new 
                                { 
                                  GroupName = g.Key, 
                                  Members = g.OrderBy(m=>m.Id)
                                });

編集 EF は、プロジェクションで ToList() を呼び出すと機能しないようです。

メンバーは ID 順のリストになり、foreach の代わりに for を実行できます

foreach (var g in groups)
{
    var members = g.Members.ToList();
    for (int i = 1, i < members.Count; i++)
    {
         var previousMember = members[i-1];
         var currentMember = members[i];
         if (..)
             // code to delete
    }
}

ただのメモ。グループ化されたメンバーを最初のクエリで射影すると、各グループ キーに対応するメンバーを選択するための別のクエリが作成されます。テーブル全体をロードしますが、後続のクエリでロードします。メモリ内でグループ化を行うことができます:

var groups = context.Essais
                      .AsEnumberable().
                      .GroupBy(p => p.BoitierNumber)
                      .Select(g => new { GroupName = g.Key, Members = g.OrderBy(m=>m.Id).ToList()  });
于 2012-04-10T11:36:20.367 に答える