繁体   English   中英

如何将EF查询与字典结合

[英]How to join EF query with dictionary

在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之类的外部数据资源结合起来?

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

首先从所需的数据库中选择数据,然后再次选择以创建完整模型。 不要在整个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]
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM