2015-01-19 1 views
1

응용 프로그램에 대한 채팅을 종료하므로 사용자가 로그인 할 때 모두 '보이지 않는'메시지를 보내야합니다. entityframework를 사용하고 있습니다. 마지막 20 개의 보이지 않는 메시지. 하지만 내 쿼리가 작동하지 않는 경우, 현재 나는이 예외중첩 컬렉션에서 마지막 n 개 요소를 가져 오는 방법

카운트가 DbConstantExpression 또는 DbParameterReferenceExpression 내가 잘못 뭐하는 거지

해야 얻을? 다음과 같이

List<ChatVM> unSeenChats = db.Chats.Where(chat => !chat.Seen) 
      .Select(chat => new ChatVM 
      { 
       Id = chat.Id, 
       IsAnnonymous = chat.IsAnnonymous, 
       UserName = chat.UserName, 
       Messages = chat.Messages 
        .OrderBy(x => x.DateTime) 
        .Skip(chat.Messages.Count - 20 > 0 
         ? chat.Messages.Count - 20 
         : 0) 
        .Take(20) 
        .Select(message => new MessageVM 
        { 
         Id = message.Id, 
         DateTime = message.DateTime, 
         Text = message.Text 
        }).ToList() 
      }).ToList(); 

내 모델

은 다음과 같습니다

public class Chat 
{ 
    ... 
    public virtual ICollection<Message> Messages { get; set; } 
} 
public class Message 
{ 
    ... 
    public int ChatId { get; set; } 
    public virtual Chat Chat { get; set; } 
} 
public class Entities : IdentityDbContext<ApplicationUser> 
{ 
    .... 
    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     ... 
     modelBuilder.Entity<Message>() 
      .HasRequired(p => p.Chat).WithMany(p => p.Messages).WillCascadeOnDelete(true); 
    } 
} 

감사

난 당신이보고있는 따라서 쿼리 (오류 내에서 .Count를 사용할 수 있다고 생각하지 않습니다

답변

2

). 어쨌든, 나는 당신이 틀린 관점에서 이것을보고 있다고 생각합니다. 아마도 OrderByDescending 방법을 사용하고 거기에서 처음 20 개의 게시물을 가져와야합니다. 이 같은

뭔가 :

List<ChatVM> unSeenChats = db.Chats.Where(chat => !chat.Seen) 
      .Select(chat => new ChatVM 
      { 
       Id = chat.Id, 
       IsAnnonymous = chat.IsAnnonymous, 
       UserName = chat.UserName, 
       Messages = chat.Messages 
        .OrderByDescending(x => x.DateTime) 
        .Take(20) 
        .Select(message => new MessageVM 
        { 
         Id = message.Id, 
         DateTime = message.DateTime, 
         Text = message.Text 
        }).ToList() 
      }).ToList(); 
+0

아니라,이 작동합니다. 감사. 나는이 "신선한 공기"가 필요했다. –

관련 문제