我一直在努力想要解决这个问题,所以我想在这里发帖。
如果我要在Parent对象和Child对象之间建立1-> Many关系。然后从我的Context中检索我的Parent对象到List对象。然后,我遍历所述列表,在每个子记录上设置“虚拟”属性。 “virtual”属性是一个定义的枚举,它定义了一个状态,即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()))
答案 0 :(得分:2)
使用预先加载的子实体来避免多个数据库查询:
var parents = db.Parents.Include(p => p.Child);
此外,如果您无法将enum属性映射到数据库列(例如,使用.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]
答案 1 :(得分: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
州的意思......
答案 2 :(得分:0)
我们还应该禁用延迟加载。这通常会导致导航属性查询数据库。本文显示了将孩子计入视图模型的快速方法: