LINQ select(使用实体框架)
具有下列表格: 信息 消息线程 MessageThreadParticipant MessageReadState 我需要使用LINQ获得以下信息,我正在使用EF4,这样它们就可以相互了解 1从线程获取前1条消息的列表,并标记这是否是给定LoginId的新消息 比如Loginid118 应该只显示一个messageID为368的项目列表,因为我参与了该对话。另外,我需要知道这是LoginId 118的一条新消息,因为MessageReadState没有我的条目 例2:登录116 应该列出4个线程,因为我参与了threadId的24、25、26、27。来自每个线程的最新消息 编辑: 如果任何人使用相同的结构LINQ select(使用实体框架),linq,entity-framework,linq-to-entities,Linq,Entity Framework,Linq To Entities,具有下列表格: 信息 消息线程 MessageThreadParticipant MessageReadState 我需要使用LINQ获得以下信息,我正在使用EF4,这样它们就可以相互了解 1从线程获取前1条消息的列表,并标记这是否是给定LoginId的新消息 比如Loginid118 应该只显示一个messageID为368的项目列表,因为我参与了该对话。另外,我需要知道这是LoginId 118的一条新消息,因为MessageReadState没有我的条目 例2:登录116 应该列出4个线
谢谢如果您不显示实体的导航属性,那么很难回答有关LINQ to实体的问题。但假设类和导航属性具有执行此类查询所需的一切,我将尝试以下方法:
var result = context.MessageThreadParticipants
.Where(mtp => mtp.LoginId == givenLoginId)
.Select(mtp => new
{
MessageThread = mtp.MessageThread,
NewestMessage = mtp.MessageThread.Messages
.OrderByDescending(m => m.CreateDate)
.Select(m => new
{
Message = m,
HasBeenRead = m.MessageReadStates
.Any(mrs => mrs.LoginId == givenLoginId)
})
.FirstOrDefault(),
})
.ToList();
因此,实体MessageThreadParticipant必须具有MessageThread属性。实体MessageThread必须具有Messages集合,实体Message必须具有MessageReadStates集合
结果是匿名对象的集合。每个对象都包含:
MessageThread:具有givenLoginId的用户参与的线程
消息:此线程中的最新消息
NewestMessage.HasBeenRead:如果已读取最新消息,则为布尔标志
谢谢斯劳玛的帮助。实际上,我尝试了几个查询,但我被困在分组上,尝试连接和GroupJoin,但都不起作用。你的代码工作得很好。正是我想要的。谢谢!。