[C#]Linq-拉数据来自两个表-效率-替代 linq 查询

发布时间: 2017/2/27 6:16:51
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我有两个表作为消息传递系统的一部分︰

RECIPIENTS
RecipientId (PK)
RecipientMemberId (FK to user table)
MessageId (FK to message table)
...

MESSAGES
MessageId (PK)
...

和这些两个 linq 查询︰

IEnumerable<int> myMessageIds = recipientRepository.Recipients.Where(x => x.RecipientMemberId == User.Identity.GetUserId()).Select(x => x.MessageId);

IEnumerable<Message> inboxMessages = messageRepository.Messages.Where(x => myMessageIds.Contains(x.MessageId));

其中拔出他们的收件箱的用户的邮件。

问题︰

这工作,但我有不祥的预感,我做错了。是这效率低下?为了好玩,一些替代 linq 查询,将更有效地产生相同的结果是什么?任何其他的评论表示赞赏。

谢谢。

解决方法 1:

var userId = User.Identity.GetUserID();

IEnumerable<Message> inboxMessages = Context
       .Messages
       .Where(x => Context.Recipients
                          .Where(r => r.RecipientMemberId == userId)
                          .Any(r => x.MessageId == r.MessageId));

但更是如此,你应该有收件人和邮件上的导航属性。

public class Recipient
{
    .....
    [Key]
    public int Id { get; set; } // If this is your PK

    public virtual ICollection<Message> Messages { get; set; } // navigational Property to Messages
}

和你的留言︰

public class Message
{
    .....
    [Key]
    public int Id { get; set; } // If this is your PK

    public int RecipientId { get; set; } // This would be FK
    public virtual Recipient Recipient { get; set; } // navigational property back to Recipient
}

然后你可以这样做︰

var recipient = Context.Recipients
                       .Where(x => x.RecipientMemberId == userId)
                       .FirstOrDefault()

var messages = recipient.Messages.ToList();

请注意,这将使 2 调用到数据库中,一个当你获取收件人。和另一个当你访问虚拟邮件属性。

若要优化这,你能告诉到 EF" Include "在其查询,然后将做一个联接中的导航属性。

例如

var recipient = Context.Recipients
                       .Include(x => x.Messages)
                       .Where(x => x.RecipientMemberId == userId)
                       .FirstOrDefault()
赞助商