gpt4 book ai didi

c# - Entity Framework - 从实体列表中获取所有子记录的计数

转载 作者:太空宇宙 更新时间:2023-11-03 10:57:43 25 4
gpt4 key购买 nike

一段时间以来,我一直在努力解决这个问题,所以我想我会在这里发帖。

如果我要在 Parent 对象和 Child 对象之间建立 1->Many 关系。然后将我的 Parent 对象从我的 Context 检索到一个 List 对象中。然后我遍历所述列表,在每个子记录上设置一个“虚拟”属性。 “虚拟”属性是一个枚举,它定义了一个状态,即新的、未改变的、无效的。它作为实体实现的抽象类的属性实现。

完成此操作后,我想统计所有状态为“新建”的子对象。

Parent.Sum(p => p.Child.Where(c => c.Status == New).Count())

第一个问题是,这会为每个父记录返回一次数据库并获取所有链接的子记录。

第二个问题,因为Status字段不是实际的数据库字段,所以取值都是枚举默认值。

如有任何帮助,我们将不胜感激。

编辑:

所以首先,我不想要数据库中的 Status 列。如果我愿意,我可以轻松添加它,但这不是我想要坚持的东西。

这可能是我能提供的完整代码的最佳示例。

List<Parent> parents = myDB.Parents.ToList();

foreach(Parent parent in parents)
{
foreach(Child child in parent.Child)
{
if (condition1)
{
child.Status == Statuses.Status1;
}
else if (condition2)
{
child.Status == Statuses.Status2;
}
else if (condition3)
{
child.Status == Statuses.Status3;
}

}
}

Console.WriteLine(Parent.Sum(p => p.Child.Where(c => c.Status == New).Count()))

最佳答案

使用预加载子实体来避免多次数据库查询:

var parents = db.Parents.Include(p => p.Child);

此外,如果您无法将枚举属性映射到数据库列(例如 EF5 和 .NET 3.5),则创建将映射到您的数据库列的整数属性,并将您的枚举属性标记为未映射:

[Column("Status")]
public int StatusInt { get; set; }
[NotMapped]
public StatusType Status
{
get { return (StatusType)StatusInt; }
set { StatusInt = (int)value; }
}

如果您将使用映射到数据库列的属性,那么所有计算都将发生在服务器端:

db.Parents.Sum(p => p.Child.Where(c => c.StatusInt == (int)New).Count())

这将被翻译成如下查询:

SELECT SUM([t2].[value]) AS [value]
FROM (
SELECT (
SELECT COUNT(*)
FROM [Child] AS [t1]
WHERE ([t1].[StatusInt] = @p0) AND ([t1].[ParentID] = [t0].[ParentID])
) AS [value]
FROM [Parent] AS [t0]
) AS [t2]

关于c# - Entity Framework - 从实体列表中获取所有子记录的计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18826566/

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