4

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

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

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

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()))
4

3 回答 3

2

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

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]
于 2013-09-16T11:20:40.870 回答
0

像这样的东西可能会起作用:

var parents = db.Parents.ToList(); 
int count = parents.Childs.Where(c => db.Entry(c).State == EntityState.Added);

这种方法解决了您的第一个问题。因为它在内存中.ToList()创建了一个List<Parent>并且所有查询都不会执行任何数据库查询。

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

事实上,这取决于你从New国家的意思......

于 2013-09-16T13:45:49.880 回答
0

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

http://www.ozkary.com/2015/04/entity-framework-associated-table.html

于 2015-05-06T13:22:17.220 回答