C# 实体框架-从实体列表中获取所有子记录的计数

C# 实体框架-从实体列表中获取所有子记录的计数,c#,entity-framework,entity-framework-5,C#,Entity Framework,Entity Framework 5,一段时间以来,我一直在绞尽脑汁想这个问题,所以我想我会在这里发布 如果在父对象和子对象之间有1->Many关系。然后将父对象从上下文检索到列表对象中。然后,我遍历所述列表,在每个子记录上设置一个“虚拟”属性。“虚拟”属性是定义状态的枚举,即新的、未更改的、无效的。它作为实体实现的抽象类上的属性实现 完成此操作后,我希望获得状态为say“New”的所有子对象的计数 第一个问题是,对于每个父记录,这会返回数据库一次,并获取所有链接的子记录 第二个问题是,因为Status字段不是实际的数据库字段,所以

一段时间以来,我一直在绞尽脑汁想这个问题,所以我想我会在这里发布

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

完成此操作后,我希望获得状态为say“New”的所有子对象的计数

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

第二个问题是,因为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()))
List parents=myDB.parents.ToList();
foreach(父对象中的父对象)
{
foreach(parent.Child中的子项)
{
如果(条件1)
{
child.Status==Statuses.Status1;
}
否则如果(条件2)
{
child.Status==Statuses.Status2;
}
否则,如果(条件3)
{
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);
此外,如果无法将枚举属性映射到数据库列(例如,带有.NET 3.5的EF5),请创建将映射到数据库列的整数属性,并将枚举属性标记为未映射:

[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]

类似的方法可能会奏效:

var parents = db.Parents.ToList(); 
int count = parents.Childs.Where(c => db.Entry(c).State == EntityState.Added);
这种方法解决了您的第一个问题。因为
.ToList()
在内存中创建了一个
列表
,对它的所有查询都不会执行任何数据库查询

但是我不确定它是否也解决了你的第二个问题。最接近您需要的EntityState是
EntityState.Added


事实上,这取决于您在
New
state中的意思…

我们还应该禁用延迟加载。这通常会导致导航属性查询数据库。本文介绍了一种快速将子计数放入视图模型的方法:


var parents=db.parents.Include(p=>p.Child);这就是为我整理的。谢谢你。
var parents = db.Parents.ToList(); 
int count = parents.Childs.Where(c => db.Entry(c).State == EntityState.Added);