无法创建类型的常量值此上下文仅支持基元类型或枚举类型

use*_*186 152 c# linq entity-framework join

我在下面的查询中收到此错误

无法创建类型的常量值API.Models.PersonProtocol.在此上下文中仅支持基元类型或枚举类型

ppCombined下面是一个IEnumerable对象PersonProtocolType,由2个PersonProtocol列表的concat构成.

为什么这会失败?我们不能使用LINQ JOIN条款里面SELECTJOIN

var persons = db.Favorites
    .Where(x => x.userId == userId)
    .Join(db.Person, x => x.personId, y => y.personId, (x, y) =>
        new PersonDTO
        {
            personId = y.personId,
            addressId = y.addressId,                   
            favoriteId = x.favoriteId,
            personProtocol = (ICollection<PersonProtocol>) ppCombined
                .Where(a => a.personId == x.personId)
                .Select( b => new PersonProtocol()
                 {
                     personProtocolId = b.personProtocolId,
                     activateDt = b.activateDt,
                     personId = b.personId
                 })
        });
Run Code Online (Sandbox Code Playgroud)

Sla*_*uma 218

这不起作用,因为它ppCombined是内存中对象的集合,您无法使用内存中的另一组数据将数据库中的一组数据连接起来.你可以尝试,而不是提取经过滤项personProtocol中的ppCombined集合中的内存后,您检索从数据库中其他属性:

var persons = db.Favorites
    .Where(f => f.userId == userId)
    .Join(db.Person, f => f.personId, p => p.personId, (f, p) =>
        new // anonymous object
        {
            personId = p.personId,
            addressId = p.addressId,   
            favoriteId = f.favoriteId,
        })
    .AsEnumerable() // database query ends here, the rest is a query in memory
    .Select(x =>
        new PersonDTO
        {
            personId = x.personId,
            addressId = x.addressId,   
            favoriteId = x.favoriteId,
            personProtocol = ppCombined
                .Where(p => p.personId == x.personId)
                .Select(p => new PersonProtocol
                {
                    personProtocolId = p.personProtocolId,
                    activateDt = p.activateDt,
                    personId = p.personId
                })
                .ToList()
        });
Run Code Online (Sandbox Code Playgroud)

  • 对我来说关键部分是添加.AsEnumerable()//数据库查询在这里结束,其余的是内存中的查询 (8认同)
  • @Slauma"这不起作用,因为ppCombined是内存中对象的集合,你不能将数据库中的一组数据与内存中的另一组数据连接起来." 我在哪里可以找到有关此类内容的文档?我真的不了解EF的限制,当我试图限制这样的查询结果集时,这种无能使得自己非常明显并且减慢了我的速度. (5认同)
  • @Slauma所以如果我关心性能,我应该避免这样做,因为它会先将所有数据加载到内存中,然后再查询它.我应该为这种情况编写原始sql吗? (2认同)