[英]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,这只是一个人写的消息数。 我该怎么做?
我有一些想法,但我认为它们会非常缓慢,因为我需要返回一个人员列表,并且每个人都需要计数。
[NotMapped]
public int MessageCount { get {return Messages.Count()}; private set; }
这是我能想到的最简单的方法,但同时在大型数据库上它似乎非常慢,因为对于每个人来说,它都需要单独去获取消息计数,这很疯狂。
这似乎是一个更好的计划。 对? 但是,我在任何地方都找不到完整的解决方案。
我知道我可以用[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.