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

时间:2015-11-06 19:17:48

标签: c# entity-framework linq dictionary linq-to-entities

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

如何将dbcontext模型与像Dictionary这样的外部数据资源或类似的东西加入?

2 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:4)

首先从您需要的数据库中选择数据,然后再次选择以制作完整模型。不要在整个AsEnumerable()上使用DbSet,因为您要检索不需要的列。

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]
});