gpt4 book ai didi

c# - Linq - 从两个表中提取数据 - 效率 - 替代 linq 查询

转载 作者:行者123 更新时间:2023-11-30 21:59:26 28 4
gpt4 key购买 nike

我有两个表作为消息系统的一部分:

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 查询?任何其他意见也表示赞赏。

谢谢。

最佳答案

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()

关于c# - Linq - 从两个表中提取数据 - 效率 - 替代 linq 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29268480/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com