如何将EF查询与字典连接起来

Ily*_*iev 1 c# linq linq-to-entities dictionary entity-framework

在global.asax中定义并填充了Dictionary

public static Dictionary<Guid, string> GlobalUserDictionary;
Run Code Online (Sandbox Code Playgroud)

在控制器中,某些逻辑通过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]
});
Run Code Online (Sandbox Code Playgroud)

但控制器抛出异常:

System.NotSupportedException:LINQ to Entities无法识别方法'System.String get_Item(System.Guid)'方法,并且此方法无法转换为存储表达式.

如何将dbcontext模型与Dictionary等外部数据资源或类似的东西相结合?

oct*_*ccl 8

要使用的字典里面Select,你需要使用的Linq to Object替代Linq to Entities.AsEnumerable扩展方法将帮助您做到这一点:

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

更新

如果不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]
});
Run Code Online (Sandbox Code Playgroud)

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