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等外部数据资源或类似的东西相结合?
要使用的字典里面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在您查阅数据之前不会执行查询,它会保留延迟执行.