将查询投影到匿名字典<string,int>

时间:2016-08-24 02:03:20

标签: c# entity-framework dictionary ienumerable

我正在尝试检查数据库中的实体是否有任何外键关系,以便我可以通知用户可以删除实体,也可以不删除实体。

我知道这可以在回滚交易中完成,但是我想告知用户有多少引用以及它们在哪里帮助他们决定删除实体。

我试图避免将整个导航集合加载到内存中以获取此数据,因为它可能很大。因此,鉴于此,我可以制定这个简单的查询,首先确定是否有任何引用:

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而不是匿名类型?

由于

修改 我目前在上下文中禁用了延迟加载。如果有一个解决方案没有打开延迟加载就可以了。

2 个答案:

答案 0 :(得分:3)

您无法在#define语句中构建#define ROBJECT_EMBED_LEN_MAX ROBJECT_EMBED_LEN_MAX #define ROBJECT_EMBED ROBJECT_EMBED enum { ROBJECT_EMBED_LEN_MAX = 3, ROBJECT_EMBED = RUBY_FL_USER1, ROBJECT_ENUM_END }; ,这就是您获得#define的原因。您可以先通过查询获取单个ruby/include/ruby/ruby.h,然后在内存中构建字典。

Dictionary<K,V>

编辑如果您没有使用延迟加载,则可以在查询中明确SELECT个属性:

System.NotSupportedException

答案 1 :(得分:0)

  

有没有办法绕过这个,这样我可以返回某种IEnumerable而不是匿名类型?

实际上有,虽然我不确定你会喜欢生成的SQL(与使用匿名类型的SQL相比)。

var query = _Context.Components.Where(c => c.ComponentID == compId)
    .SelectMany(comp => new []
    {
        new { Key = "Events", Value = comp.Incidents.Count() },
        new { Key = "Drawings", Value = comp.Drawings.Count() },
        new { Key = "Documents", Value = comp.Documents.Count() },
        new { Key = "Tasks", Value = comp.Tasks.Count() },
        new { Key = "Images", Value = comp.Images.Count() },
        new { Key = "Instructions", Value = comp.Instructions.Count() },
     }.ToList());

var result = query.ToDictionary(e => e.Key, e => e.Value);

return query.Any(fk => fk.Value > 0);