无法创建类型为常数的值,此上下文只支持基元类型或枚举类型

对于下面的查询,我得到了这个错误

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

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

为什么会失败? 我们不能在 JOINSELECT中使用 LINQJOIN子句吗?

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
})
});
243053 次浏览

这无法工作,因为 ppCombined是内存中对象的集合,您不能将数据库中的一组数据与内存中的另一组数据联接起来。相反,您可以尝试从内存 之后中提取 ppCombined集合中经过过滤的项目 personProtocol,您已经从数据库中检索到了其他属性:

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

不知道有没有人搜索这个。 我也有同样的问题。对查询进行选择,然后执行 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);

希望这对大家有帮助。

就我而言,我能够通过做以下事情来解决这个问题:

我改了我的代码:

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

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

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


ToList().AsEnumerable()

值得补充的是,由于 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);
}

我有这个问题,我所做的和 解决了的问题是,我使用 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()等,您将他们放入物理内存对象和问题是解决。