拥有以下表格:
我需要使用LINQ获得以下内容(我正在使用EF4,因此这些人彼此了解)。
1)获取TOP 1消息列表(来自一个线程),同时标记这是否是给定LoginId的新消息
所以例如(loginId 118)
应该只显示一个带有messageID的项目列表:368(因为我参与了该对话)。此外,我需要知道这是LoginId 118的新消息,因为MessageReadState没有我的条目。
example2 :(登录116) 应列出4个主题,因为我参加了threadId(24,25,26,27)。使用每个帖子的最新消息。
编辑:
EF(如果有人使用相同的结构)
感谢
答案 0 :(得分:4)
如果您没有向您的实体显示其导航属性,则很难回答有关LINQ(实体)的问题。但假设类和导航属性具有执行此类查询所需的一切,我会尝试这样做:
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
个集合。
result
是匿名对象的集合。每个对象都包含:
MessageThread
:givenLoginId
用户参与NewestMessage.Message
:此主题中的最新消息NewestMessage.HasBeenRead
:如果已读取最新消息,则为布尔标志