2011-09-21 128 views
-1

具有如下表:LINQ选择(使用实体框架)

  • 消息

enter image description here


  • MessageThread

enter image description here


  • MessageThreadParticipant

enter image description here


  • MessageReadState

enter image description here

我需要得到以下使用LINQ(我使用EF4,所以这些都知道对方)。

1)获取TOP 1消息的列表(从一个线程),也标记,如果这是对于给定的登录ID

因此,例如一个新的消息(登录ID 118)

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

示例2 :(登录116) 应该列出4个线程,因为我参与threadId的(24,25,26,27)。用每个线程的最新消息。

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

感谢

回答

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:线程在
  • NewestMessage.MessagegivenLoginId参与的用户:在这个线程
  • NewestMessage.HasBeenRead最新消息:一个布尔标志,如果最新的邮件已读
+0

谢谢Slauma为您提供帮助。我实际上尝试了几个查询,但我被困在分组(尝试连接和groupjoins),但没有奏效。你的代码效果很好。正是我所期待的。非常感谢!。 – ShaneKm