在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无法识别
  方法'System.String get_Item(System.Guid)'方法,
  方法不能转换为商店表达式。


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

最佳答案

要在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不会执行查询,而是保留延迟的执行。

09-25 17:47