繁体   English   中英

EF6:参考文献计数

[英]Ef6: count of the references

我有2个简单的对象。

public class Person
{
  public int Id { get; set; }
  public string Name { get; set; }
  public List<Message> Messages { get; set; }
  //public int MessageCount { get; set; }
}

Public class Message
{
   public int Id { get; set; }
   public string Text { get; set; }
}

我需要为每个人显示MessageCounts,这只是一个人写的消息数。 我该怎么做?

我有一些想法,但我认为它们会非常缓慢,因为我需要返回一个人员列表,并且每个人都需要计数。

我的想法

1在代码

[NotMapped]
public int MessageCount { get {return Messages.Count()}; private set; }

这是我能想到的最简单的方法,但同时在大型数据库上它似乎非常慢,因为对于每个人来说,它都需要单独去获取消息计数,这很疯狂。

2-具有返回值的函数的计算列

这似乎是一个更好的计划。 对? 但是,我在任何地方都找不到完整的解决方案。

我知道我可以用[DatabaseGenerated(DatabaseGeneratedOption.Computed)]装饰属性,这会使它从计算字段中读取,但是如何创建一个返回值并使用该值的函数呢?

我在这里找到了一些东西但他使用的是同一张表中的代码,可以使用普通的计算字段来完成。 我也在“ EF代码优先”中的“计算后”列中发表了这篇文章但没有答案是我的问题。

-

考虑到我的问题,应该在许多应用程序中都能看到。 难道没有任何简便而高性能的方法吗?

更新资料

多亏有评论的人,我想最好的方法是创建2种类型,一种对应于真实的人类,并将其用于常规的CRUD动作,另一种只是来自联接显示列表的视图。 有任何想法吗? :)

您将需要在Message和编写该消息的用户之间建立一个关系字段,如下所示:

Public class Message
{
   public int Id { get; set; }
   public string Text { get; set; }
   public int UserId {get; set; }
}

那么当您可以使用简单的linq查询来计算消息时,如下所示:

context.Messages.Count(m=> m.UserId == id);

linq经过了优化,可以做到最好,但是如果数据库很大,您将需要通过设计来进行优化,并且最好保留消息计数的持久字段,并且可以使用触发器中的触发器来增加它出版物之类的东西。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM