如何将 EF 查询与字典连接起来
How to join EF query with dictionary
在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 does not recognize
the method 'System.String get_Item(System.Guid)' method, and this
method cannot be translated into a store expression.
如何将 dbcontext 模型与外部数据资源(如字典或类似的东西)连接起来?
要在 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];
});
更新
在不先过滤数据的情况下调用 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
在您查阅数据之前不会执行查询,它保留了延迟执行。
首先 select 从您需要的数据库中获取数据,然后再次 select 以制作您的完整模型。不要在整个 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]
});
在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 does not recognize the method 'System.String get_Item(System.Guid)' method, and this method cannot be translated into a store expression.
如何将 dbcontext 模型与外部数据资源(如字典或类似的东西)连接起来?
要在 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];
});
更新
在不先过滤数据的情况下调用 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
在您查阅数据之前不会执行查询,它保留了延迟执行。
首先 select 从您需要的数据库中获取数据,然后再次 select 以制作您的完整模型。不要在整个 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]
});