4

私はしばらくこれをいじっていて、それを手に入れることができません。私はLinq、C#、およびこれらのLambdaのものに不慣れです。

私がやりたいのは、各エンティティの2つのプロパティに従ってエンティティをグループ化することです。これはメッセージエンティティです:

Message
{
int UserId; //The user generating the message
int UserIdTo; //The receiver of the message
|...| // Other stuff 
}

したがって、これらのUserId = 5、UserIdTo=6とUserId=6、UserIdTo=5が同じグループに含まれるようにする必要があります。

これが私のスタートです:

var groupList = (from m in db.Messages
                             where m.UserId == userId || m.UserIdTo == userId
                             join u in db.Users on m.UserId equals u.UserId
                             join w in db.Users on m.UserIdTo equals w.UserId
                             orderby m.MessageTimestamp descending
                             select new DomMessage
                             {
                                 MessageId = m.MessageId,
                                 MessageContent = m.MessageContent,
                                 MessageTimestamp = m.MessageTimestamp,
                                 UserId = m.UserId,
                                 UserIdTo = m.UserIdTo,
                                 ScreenName = u.ScreenName,
                                 ScreenName2 = w.ScreenName
                             }).GroupBy(m=>m.UserId == userId)
                             .ToList();

これはUserIdによるグループ化の最初のビットを実行しますが、結果のグループのUserId値がUserIdToと等しくなるようにこれを拡張しようとして立ち往生していますが、他の場所でそれをこのグループに追加しますか?

編集:私はそれでやらなければならない他のことがあるので、私はリストに行くために結果が必要です...

ありがとう!

4

3 に答える 3

2

これを試して:

var payload = new[] 
        {
            new{ To = 1, From = 2, Message = "msj1" },
            new{ To = 1, From = 2, Message = "msj2" },
            new{ To = 2, From = 1, Message = "msj3" },
            new{ To = 4, From = 1, Message = "msj4" },
            new{ To = 1, From = 3, Message = "msj5" }
        };


        var groupped = payload.Select(x => new { Key = Math.Min(x.To, x.From) + "_" + Math.Max(x.To, x.From), Envelope = x }).GroupBy(y => y.Key).ToList();

        foreach (var item in groupped)
        {
            Console.WriteLine(String.Format(@"Group: {0}, messages:", item.Key));

            foreach (var element in item)
            {
                Console.WriteLine(String.Format(@"From: {0} To: {1} Message: {2}", element.Envelope.From, element.Envelope.To, element.Envelope.Message));
            }
        }
于 2012-06-06T16:20:34.957 に答える
1

次のGroupBy式を試してください。

.GroupBy(m => Math.Min(m.UserId, m.UserIdTo) + ',' + Math.Max(m.UserId, m.UserIdTo))
于 2012-06-06T15:42:15.377 に答える
0

これが最も簡単な方法だと思います。

var groupList = from a in (
from m in db.Messages
where m.UserId == userId || m.UserIdTo == userId
join u in db.Users on m.UserId equals u.UserId
join w in db.Users on m.UserIdTo equals w.UserId
select new 
{
 MessageId = m.MessageId,
 MessageContent = m.MessageContent,
 MessageTimestamp = m.MessageTimestamp,
 UserId = m.UserId,
 UserIdTo = m.UserIdTo,
 ScreenName = u.ScreenName,
 ScreenName2 = w.ScreenName
})
group a by new { 
    UserId = a.UserId,
     UserIdTo = a.UserIdTo
    } into grp
orderby grp.Max(a => a.MessageTimestamp) descending
select new
{
 UserId = grp.Key.UserId
 UserIdTo = grp.Key.UserIdTo,
 MessageId = grp.Max(a => a.MessageId),
 MessageContent = grp.Max(a => a.MessageContent),
 MessageTimestamp = grp.Max(a => a.MessageTimestamp),
 ScreenName = grp.Max(a => a.ScreenName),
 ScreenName2 = grp.Max(a => a.ScreenName2)
}

グループ化していないフィールドをどうするかを指示する必要があります。この場合、それぞれのMAX値を取得しました。

于 2012-06-06T16:37:36.500 に答える