同一实体中不同键上的C#linq group by
我已经玩了一段时间了,就是弄不懂。我对林克,C#和这些兰姆达的东西还不熟悉 我想做的是根据每个实体上的两个属性对实体进行分组。它是一个消息实体:同一实体中不同键上的C#linq group by,c#,asp.net,linq,lambda,C#,Asp.net,Linq,Lambda,我已经玩了一段时间了,就是弄不懂。我对林克,C#和这些兰姆达的东西还不熟悉 我想做的是根据每个实体上的两个属性对实体进行分组。它是一个消息实体: 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在同一个组
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的地方将其添加到此组中
编辑:我需要的结果去一个列表,因为有其他的东西,我需要用它做
谢谢 尝试以下GroupBy表达式:
.GroupBy(m => Math.Min(m.UserId, m.UserIdTo) + ',' + Math.Max(m.UserId, m.UserIdTo))
试试这个:
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));
}
}
我认为这是最简单的方法:
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)
}
您必须告诉它如何处理您未分组的字段。在本例中,我得到了每个的最大值。错误:(
LINQ-to-Entities不识别方法“Int32-Min(Int32,Int32)”'方法,此方法无法转换为存储表达式。
如果我有更多时间,我将尝试使用此方法,因为它看起来很有希望…感谢您的努力!为了记录在案,这也满足了我的需要,添加了一个尾随ToList()您可以避免错误。我使用Adrian的,因为我需要他使用的信封。谢谢您的努力,但我得到了相同的问题,例如,您的条目new{To=1,From=2,Message=“msj1”}
和new{To=2,From=1,Message=“msj3”}
未分组together@testpattern你曾经在控制台应用程序上尝试过这个吗?或者你的理论上。我可以发送打印屏幕给你,让你看看它的工作原理。阿德里安,你是对的,它满足了我的需要,谢谢你!另外,对我来说,在控制台应用程序上尝试东西也是个好主意