0

我知道我的标题不是很具体,而且我确定我的问题已经在某个地方被问过,但我不知道如何搜索它。

我正在使用带有实体框架的 asp.net MVC,并且我有以下模型:

public class Receipt 
{        
    public int ReceiptId { get; set; }

    public bool Deleted { get; set; }

    public int UseraccountId { get; set; }

    public int MessageId { get; set; }

    public virtual Useraccount Useraccount { get; set; }

    public virtual Message Message { get; set; }

}//end Receipt

一个用户有多个收据。我想从特定用户那里获取所有消息。

到目前为止,这就是我的做法:

//Get receipts of the logged in user
List<Receipt> receipts = UnitOfWork.ReceiptRepository.Get(
    u => u.UseraccountId == loggedInUser.UseraccountId).ToList<Receipt>();

//Get all messages of the receipts
List<Message> messages = new List<Message>();
foreach (Receipt receipt in receipts)
{
    messages.Add(receipt.Message);
}

有没有更好的办法?

提前致谢。

4

1 回答 1

1

你有从消息到收据的链接吗?我从您的 Receipt 类中假设它与您的 Message 类具有一对一的关系。为了能够执行此方法,您的 Message 类应如下所示:

public class Message
{
    public int MessageId {get; set;}
    //other properties here

    //these provide the backward link to the Receipt that "owns" the message
    public int ReceiptId {get; set;} 
    public virtual Receipt Receipt {get; set;} 
 }

你的模型应该通过类似这样的东西来识别这个链接(如果你使用的是 Code First)

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Receipt>()
        .HasOptional(r => r.Message)
        .WithRequired(m => m.Receipt);
}

您的查询应该在存储库级别完成,特别是消息存储库,因为它将是有权访问您的数据库上下文的层。您的查询可能如下所示:

public IEnumerable<Message> GetAllMessagesByUserId (int userId)
{
    return context.Set<Message>().Include(x => x.Receipt)
                          .Include (x => x.Receipt.Useraccount)
                          .Where (x => x.Receipt.Useraccount.UseraccountId == userId)
                          .ToList();
}

当您调用 UnitOfWork.MessageRepository.GetAllMessagesByUserId (loggedInUser.UseraccountId) 时,它应该返回链接到您感兴趣的用户的所有消息。

于 2013-02-19T13:38:43.313 回答