【问题标题】:How to join EF query with dictionary如何将 EF 查询与字典连接
【发布时间】:2015-11-06 19:17:47
【问题描述】:

在 global.asax 中定义和填充的字典

public static Dictionary<Guid, string> GlobalUserDictionary;

在控制器中,一些逻辑通过 EF DbContext 从 db 加载数据

var db = new DbModel();

var visits = db.Visits.Select(d => new
{
    Id = d.Id,
    UserId = d.UserId,
    User = MvcApplication.GlobalUserDictionary[d.UserId]
});

但是控制器抛出异常:

System.NotSupportedException:LINQ to Entities 无法识别 方法 'System.String get_Item(System.Guid)' 方法和这个 方法无法转换为商店表达式。

如何将 dbcontext 模型与 Dictionary 或类似的外部数据资源结合起来?

【问题讨论】:

    标签: c# entity-framework linq dictionary linq-to-entities


    【解决方案1】:

    要使用Select 中的字典,您需要使用Linq to Object 而不是Linq to EntitiesAsEnumerable 扩展方法将帮助您做到这一点:

        var visits = db.Visits.AsEnumerable().Select(d => new
        {
            Id = d.Id,
            UserId = d.UserId,
            User = MvcApplication.GlobalUserDictionary[d.UserId];
        });
    

    更新

    确实,如果不先过滤您的数据,致电AsEnumerable 确实不是一个好主意,但在这样做之后,调用它可能是个好主意:

    var visits = db.Visits.Select(d => new
    {
        d.Id,
        d.UserId
    })
    .AsEnumerable()
    .Select(d => new
    {
        Id = d.Id,
        UserId = d.UserId,
        User = MvcApplication.GlobalUserDictionary[d.UserId]
    });
    

    使用AsEnumerable 而不是ToList 的优点是AsEnumerable 在您查阅数据之前不会执行查询,它保留了延迟执行。

    【讨论】:

    • d.UserId 不是来自查询中的 lambda?
    • 但是我如何在查询之外使用 D? D 在当前上下文中不存在。
    • 这是真的,我的错误伙计们,我已经更新了我的答案
    • 不用担心。第一行也是不必要的。
    • 如果 Visits 有 20 列,您的代码将检索 18 列不必要的数据。这可能是一个相当重要的性能问题。
    【解决方案2】:

    首先从您需要的数据库中选择数据,然后再次进行选择以制作完整模型。不要在整个 DbSet 上使用 AsEnumerable(),因为您会检索到不需要的列。

    var visits = db.Visits.Select(d => new
    {
        d.Id,
        d.UserId
    })
    .ToList()
    .Select(d => new
    {
        Id = d.Id,
        UserId = d.UserId,
        User = MvcApplication.GlobalUserDictionary[d.UserId]
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-27
      • 1970-01-01
      相关资源
      最近更新 更多