LINQ选择(使用实体框架)

时间:2011-09-21 13:21:59

标签: linq entity-framework linq-to-entities

拥有以下表格:

  • 消息

enter image description here


  • MessageThread

enter image description here


  • MessageThreadParticipant

enter image description here


  • MessageReadState

enter image description here

我需要使用LINQ获得以下内容(我正在使用EF4,因此这些人彼此了解)。

1)获取TOP 1消息列表(来自一个线程),同时标记这是否是给定LoginId的新消息

所以例如(loginId 118)

应该只显示一个带有messageID的项目列表:368(因为我参与了该对话)。此外,我需要知道这是LoginId 118的新消息,因为MessageReadState没有我的条目。

example2 :(登录116) 应列出4个主题,因为我参加了threadId(24,25,26,27)。使用每个帖子的最新消息。

编辑: EF(如果有人使用相同的结构) enter image description here

感谢

1 个答案:

答案 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是匿名对象的集合。每个对象都包含:

  • MessageThreadgivenLoginId用户参与
  • 的主题
  • NewestMessage.Message:此主题中的最新消息
  • NewestMessage.HasBeenRead:如果已读取最新消息,则为布尔标志
相关问题