如何将EF查询与字典连接

本文关键字:字典 连接 查询 EF | 更新日期: 2023-09-27 18:20:51

在global.asax中定义并填充字典

public static Dictionary<Guid, string> GlobalUserDictionary;

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

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或类似的外部数据资源连接起来?

如何将EF查询与字典连接

要在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在查询数据之前不会执行查询,它保留了延迟执行。

首先从数据库中选择所需的数据,然后再次进行选择以生成完整的模型。不要在整个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]
});