我在下面的查询中收到此错误
下面的无法创建
API.Models.PersonProtocol
类型的常量值。此上下文仅支持原始类型或枚举类型
ppCombined
是IEnumerable
的{{1}}个对象,由2个PersonProtocolType
列表连成。
为什么会失败?我们不能在PersonProtocol
的{{1}}内使用LINQ JOIN
子句吗?
SELECT
答案 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()
等时,会将它们放入物理内存对象中,问题就可以解决。