181

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

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

ppCombined下面是 的一个IEnumerable对象,它是由 2 个列表PersonProtocolType的 concat 构造的。PersonProtocol

为什么会失败?我们不能在aJOIN中使用 LINQ 子句吗?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
                 })
        });
4

6 回答 6

263

这是行不通的,因为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()
        });
于 2013-09-22T13:45:52.620 回答
3

就我而言,我可以通过执行以下操作来解决问题:

我从这里更改了我的代码:

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();
于 2018-02-07T00:21:20.447 回答
2

不知道有没有人搜索这个。我有同样的问题。对查询进行选择,然后执行 where(或 join)并使用 select 变量为我解决了这个问题。(问题出在我的“重新整合”系列中)

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

希望这对任何人都有帮助。

于 2016-04-06T07:23:13.590 回答
1

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

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()orToList()等​​时,您将它们放入物理内存对象中,问题正在解决。

于 2020-07-18T08:42:34.147 回答
1

值得添加,因为 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);
}
于 2018-11-01T16:16:23.787 回答
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()
于 2018-10-31T13:24:13.533 回答