【发布时间】:2016-08-24 02:03:19
【问题描述】:
我正在尝试检查数据库中的实体是否有任何外键关系,以便我可以通知用户该实体可以或不能删除。
我知道这可以在回滚事务中完成,但是我想通知用户有多少引用以及他们在哪里帮助他们决定删除实体。
我试图避免将整个导航集合加载到内存中以获取此数据,因为它可能很大。所以,鉴于此,我可以制定这个简单的查询来首先确定是否有任何引用:
private bool CanDeleteComponent(int compId)
{
var query = _Context.Components.Where(c => c.ComponentID == compId)
.Select(comp => new
{
References = comp.Incidents.Any() &&
comp.Drawings.Any() &&
comp.Documents.Any() &&
comp.Tasks.Any() &&
comp.Images.Any() &&
comp.Instructions.Any()
});
var result = query.FirstOrDefault();
if (result != null)
{
return !result.References;
}
return true;
}
这会执行一系列SELECT COUNT(*) FROM <TABLE> WHERE... 查询。
现在,我想提供一些有关参考数量的更多信息。理想情况下,我想返回一个带有引用数据名称和相关计数的字典。这样我就可以遍历结果,而不是访问匿名类型的单个属性。但是,我尝试过的结果是异常:
var query = _Context.Components.Where(c => c.ComponentID == compId)
.Select(comp => new Dictionary<string, int>
{
{"Events", comp.Incidents.Count()},
{"Drawings", comp.Drawings.Count()},
{"Documents", comp.Documents.Count()},
{"Tasks", comp.Tasks.Count()},
{"Images", comp.Images.Count()},
{"Instructions", comp.Instructions.Count()},
});
var result = query.FirstOrDefault();
return query.Any(fk => fk.Value > 0);
引发的异常是:
A first chance exception of type 'System.NotSupportedException' occurred in EntityFramework.SqlServer.dll
Additional information: Only list initializer items with a single element are supported in LINQ to Entities.
有没有什么办法可以让我返回某种 IEnumerable 而不是匿名类型?
谢谢
编辑 我目前在我的上下文中禁用了延迟加载。如果有没有打开延迟加载的解决方案,将不胜感激。
【问题讨论】:
标签: c# entity-framework dictionary ienumerable