2

このような従来の SQL 文から:

SELECT Id, Owner, MIN(CallTime) 
FROM traffic 
WHERE CallType = "IN" 
GROUP BY Owner;

whereCallTimeは datetime フィールドです。私が欲しいのは、 each に属する最も古いレコードOwnerです。

Linqでこれを達成するにはどうすればよいですか?

これは私の試みでした(私はEntity Frameworkを使用してcontextおり、エンティティインスタンスです):

var query = context.traffic.Where(t => t.CallType == "IN");
var results = query
    .GroupBy(t => t.Owner)
    .Select(g => new { CallTime = g.Min(h => h.CallTime) });

しかし、私はIdOwnerフィールドにもアクセスする必要がありますが、今は にしかアクセスできませんCallTime

4

3 に答える 3

3

所有者ごとにグループ化しており、グループのキーは「トラフィック」オブジェクトではなく所有者になるため、指定されたコードのIDにアクセスできません。

トラフィックオブジェクトでグループ化する場合は、それらを適切に比較する方法(つまり、所有者ごとにグループ化)をgroupByに伝える方法が必要です。これはIEqualityComparerで実行できます。

例えば

private class Traffic {
    public int Id { get; set; }
    public string Owner { get; set; }
    public DateTime CallTime { get; set; }
}

private class TrafficEquaityComparer : IEqualityComparer<Traffic> {
    public bool Equals(Traffic x, Traffic y) {
            return x.Owner == y.Owner;
    }

    public int GetHashCode(Traffic obj) {
        return obj.Owner.GetHashCode();
    }
}


private static TrafficEquaityComparer TrafficEqCmp = new TrafficEquaityComparer();

private Traffic[] src = new Traffic[]{
   new Traffic{Id = 1, Owner = "A", CallTime = new DateTime(2012,1,1)},  // oldest
   new Traffic{Id = 2, Owner = "A", CallTime = new DateTime(2012,2,1)},
   new Traffic{Id = 3, Owner = "A", CallTime = new DateTime(2012,3,1)},
   new Traffic{Id = 4, Owner = "B", CallTime = new DateTime(2011,3,1)},
   new Traffic{Id = 5, Owner = "B", CallTime = new DateTime(2011,1,1)},   //oldest
   new Traffic{Id = 6, Owner = "B", CallTime = new DateTime(2011,2,1)},
};

[TestMethod]
public void GetMinCalls() {
     var results = src.GroupBy(ts => ts, TrafficEqCmp)
                        .Select(grp => {
                            var oldest = grp.OrderBy(g => g.CallTime).First();
                            return new { Id = oldest.Id, 
                                         Owner = grp.Key.Owner, 
                                         CallTime = oldest.CallTime };

                        });    }

これは与える

ID : Owner : MinCallTime

1 :    A   :  (01/01/2012 00:00:00)
5 :    B   :  (01/01/2011 00:00:00)

結果として。

于 2012-07-17T11:32:37.943 に答える
2

あなたのSQLクエリは私には有効に見えません.使用してIdいますが、それによってグループ化していません. IdOwner?でグループ化したかったと思います。

var results = query
     .GroupBy(t => new {Id = t.Id, Owner = t.Owner})
     .Select(g => new { Id = g.Key.Id, Owner = g.Key.Owner, CallTime = g.Min(h => h.CallTime) })
     .ToList();

グループ化するのではなく、最も古い(最小の)ものを取得したい場合ID

var results = query
     .GroupBy(t => t.Owner)
     .Select(g => new { Id = g.Min(x => x.Id), Owner = g.Key, CallTime = g.Min(h => h.CallTime) })
     .ToList();
于 2012-07-17T10:58:17.887 に答える
0

//custQueryIEnumerable<IGrouping<string, Customer>>

var custQuery =  
    from cust in customers  
    group cust by cust.City into custGroup  
    where custGroup.Count() > 2  
    orderby custGroup.Key  
    select custGroup;  

その例では、グループを選択します

于 2012-07-17T10:58:24.303 に答える