-1

私のEFモデルでは: ここに画像の説明を入力してください

私はこの見方をします:

ここに画像の説明を入力してください

次のLINQクエリを使用して(あなたの助けを借りて):

var query = ctx.data.ToList().OrderBy(d => d.Time).
     GroupBy(d => d.Members.StepId).
     SelectMany(g => g.Select((d, place) => new { Time = d.Time, Members = d.Members, PlaceInStep = place + 1 })).
     GroupBy(d => d.Members.TeamId).
     Select(g => new 
     {
         TeamId = g.Key, 
         Name = g.Select(d => d.Members.Teams.TeamName).First(),  
         Members = g.Select(d => new {Time = d.Time, PlaceInStep = d.PlaceInStep, MemberName = d.Members.MemberName}),                    
         TotalTime = g.Aggregate(new TimeSpan(), (sum, nextData) => sum.Add(nextData.Time))
     });

しかし、私には2つの問題があります。

1.同じステップの2人のメンバー(たとえば、35歳より前)がミリ秒まで同じ時間を持っている場合、それらは同じ場所にある必要があります

2.結果のMembersサブコレクションで、StepIdでメンバーを配置し、StepNameを表示します。

このクエリを変更するにはどうすればよいですか?ありがとう。

編集1:

私はこれをいくつか取りたい:

ここに画像の説明を入力してください

4

1 に答える 1

1

正しいメンバーの場所を計算するためのSQLクエリ:

select *, DENSE_RANK() over (partition by StepId order by Time)
from Members m
join Data d on m.MemberId =d.MemberId

既存のlinqクエリに採用されたlinqと同等のもの:

var query = context.Data.ToList()
    .OrderBy(d=>d.Time)
    .GroupBy(d => d.Members.StepId)
    .SelectMany(g => 
        g.OrderBy(d => d.Time)
        .GroupBy(d => d.Time)
        .SelectMany((x, place) => 
            x.Select(d => new { Time = d.Time, Members = d.Members, PlaceInStep = place + 1 })))
    .GroupBy(d => d.Members.TeamId)
    .Select(g => new
    {
        TeamId = g.Key,
        Name = g.Select(d => d.Members.Teams.TeamName).First(),
        Members = g.Select(d => 
            new 
            { 
                Time = d.Time, 
                PlaceInStep = d.PlaceInStep, 
                MemberName = d.Members.MemberName, 
                StepName = d.Members.Steps.StepName, 
                StepId = d.Members.Steps.StepId 
            }).OrderBy(x=>x.StepId),
        TotalTime = g.Aggregate(new TimeSpan(), (sum, nextData) => sum.Add(nextData.Time))
    });
于 2012-11-23T19:55:26.093 に答える