【发布时间】:2019-12-01 17:55:04
【问题描述】:
有没有办法按多个列进行分组,就好像这些列在 C# 中使用 Linq 合并一样?
假设我有一个对象表示从一个用户发送给另一个用户的消息:
public class Message
{
public Int32 SenderId { get; set; }
public Int32 RecipientId { get; set; }
public String Text { get; set; }
public DateTime SentAt { get; set; }
}
我从存储库中获取了一组这些,然后我必须按发送日期对它们进行排序,并按配对 SenderId, RecipientId 过滤掉它们。但我只想从两个用户之间的给定对话中取回最后一条消息。方向无所谓,所以
(SenderId == 1 && RecipientId == 2)
应该被视为
(SenderId == 2 && RecipientId == 1)
到目前为止,我得到了这个:
Messages
.GroupBy(m => new { m.SenderId, m.RecipientId })
.Select(gm => gm.OrderByDescending(m => m.SentAt).FirstOrDefault());
但是这种方法的问题是当我有一条消息从用户 1 发送到用户 2 时,反之亦然 2 => 1,两者都会被返回。因为键 (1,2) 与 (2,1) 不同。
任何建议都会很棒。谢谢!
UPD:我应该补充说我正在使用带有 IQueryable 表达式的表达式。所以它是 LINQ to Entity。
【问题讨论】:
-
您使用的是哪个 .NET 和 C# 版本?您可以将键转换为元组并为此使用自定义比较器
-
我使用 .net core 2.2 和任何版本的 C#。但它不支持元组。但如果我找不到解决方案,我会升级。可以举个例子吗?
-
其实它支持元组,你可以尝试将
(m => new { m.SenderId, m.RecipientId }更改为m => (m.SenderId, m.RecipientId)并检查它是如何工作的 -
它在我的代码下划线并说“表达式树可能不包含元组文字。”
-
它是 VS Code 和 netstandard2.0 库,根据此表 docs.microsoft.com/en-us/dotnet/csharp/language-reference/… 默认使用 C# 7.3。我真的不明白为什么我不能使用命名元组。
标签: c# .net entity-framework linq