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

时间:2013-09-21 06:01:29

标签: c# linq entity-framework join

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

  

无法创建API.Models.PersonProtocol类型的常量值。此上下文仅支持原始类型或枚举类型

下面的

ppCombinedIEnumerable的{​​{1}}个对象,由2个PersonProtocolType列表连成。

为什么会失败?我们不能在PersonProtocol的{​​{1}}内使用LINQ JOIN子句吗?

SELECT

6 个答案:

答案 0 :(得分:202)

这不起作用,因为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()
        });

答案 1 :(得分:2)

不知道是否有人搜索此内容。 我有同样的问题。选择查询然后执行where(或join)并使用select变量解决了我的问题。  (问题出现在我的收藏品“Reintegraties”中)

query.Select(zv => new
            {
                zv,
                rId = zv.this.Reintegraties.FirstOrDefault().Id
            })
            .Where(x => !db.Taken.Any(t => t.HoortBijEntiteitId == x.rId
                                             && t.HoortBijEntiteitType == EntiteitType.Reintegratie
                                             && t.Type == TaakType))
            .Select(x => x.zv);

希望这有助于任何人。

答案 2 :(得分:2)

就我而言,我能够通过以下方式解决问题:

我改变了我的代码:

var r2 = db.Instances.Where(x => x.Player1 == inputViewModel.InstanceList.FirstOrDefault().Player2 && x.Player2 == inputViewModel.InstanceList.FirstOrDefault().Player1).ToList();

对此:

var p1 = inputViewModel.InstanceList.FirstOrDefault().Player1;
var p2 = inputViewModel.InstanceList.FirstOrDefault().Player2;
var r1 = db.Instances.Where(x => x.Player1 == p1 && x.Player2 == p2).ToList();

答案 3 :(得分:0)

只需添加AsEnumerable()和ToList(),就看起来像这样

db.Favorites
    .Where(x => x.userId == userId)
    .Join(db.Person, x => x.personId, y => y.personId, (x, y).ToList().AsEnumerable()

ToList().AsEnumerable()

答案 4 :(得分:0)

值得添加,因为OP的代码示例没有提供足够的上下文来证明相反,但是我在以下代码上也收到了此错误:

public RetailSale GetByRefersToRetailSaleId(Int32 refersToRetailSaleId)
{
    return GetQueryable()
        .FirstOrDefault(x => x.RefersToRetailSaleId.Equals(refersToRetailSaleId));
}

显然,在这种情况下,我不能使用Int32.Equals来将Int32与原始int进行比较;我不得不(安全地)更改为:

public RetailSale GetByRefersToRetailSaleId(Int32 refersToRetailSaleId)
{
    return GetQueryable()
      .FirstOrDefault(x => x.RefersToRetailSaleId == refersToRetailSaleId);
}

答案 5 :(得分:0)

我遇到了这个问题,我做了什么, 已解决 ,问题是我在Join子句之前使用了AsEnumerable()。 这是我的查询:

List<AccountViewModel> selectedAccounts;

 using (ctx = SmallContext.GetInstance()) {
                var data = ctx.Transactions.
                    Include(x => x.Source).
                    Include(x => x.Relation).
                    AsEnumerable().
                    Join(selectedAccounts, x => x.Source.Id, y => y.Id, (x, y) => x).
                    GroupBy(x => new { Id = x.Relation.Id, Name = x.Relation.Name }).
                    ToList();
            }

我想知道为什么会发生此问题,现在我想这是因为在您通过 LINQ 进行查询之后,结果将在内存中而不是加载到对象中,我不知道那个状态是什么,但我认为他们处于某种过渡状态。然后,当您使用AsEnumerable()ToList()等时,会将它们放入物理内存对象中,问题就可以解决。