C#加入了列表.林克.无法创建常量类型
本文关键字:创建 常量 类型 林克 列表 | 更新日期: 2023-09-27 18:21:00
想象一下下面的方法。
public async Task<IHttpActionResult> Get(int id)
{
List<PageVirtualServer> pageVirtualServer = await context.PageVirtualServer
.Where(z => z.StatusPageId == id)
.ToListAsync();
List<StatusMessage> messages = await context.StatusMessages
.Where(x => pageVirtualServer.Any(
y => y.VirtualServerId == x.VirtualServerId))
.ToListAsync();
return Ok(messages);
}
出现以下异常。。"无法创建'xy'类型的常量值。此上下文中只支持基元类型或枚举类型。"
但当将第一个查询嵌入到第二个查询中时,它确实有效,我不明白。
为什么这种方法有效,而第一种方法无效?
public async Task<IHttpActionResult> Get(int id)
{
List<StatusMessage> messages = await context.StatusMessages
.Where(x =>
context.PageVirtualServer
.Where(z => z.StatusPageId == id)
.Any(y => y.VirtualServerId == x.VirtualServerId))
.ToListAsync();
return Ok(messages);
}
有人能解释这种行为吗?
在第一个示例中,您在内存中具体化了一个PageVirtualServer
对象列表,并将该(复杂)对象列表传递给第二个查询。Linq to Entities无法将其转换为SQL。
在第二个查询中,您实际上告诉EF使用表context.PageVirtualServer
,从而使EF生成一个SQL查询来同时执行整个操作。
要在两个步骤中执行这样的操作,您可以在第一个查询中具体化ID:
List<int> pageVirtualServerIDs = await context.PageVirtualServer
.Where(z => z.StatusPageId == id)
.Select(z => z.Id)
.ToListAsync();
List<StatusMessage> messages = await context.StatusMessages
.Where(x => pageVirtualServerIDs.Contains(x.VirtualServerId))
.ToListAsync();
然而,我强烈希望坚持一个问题。写这篇文章的一种稍微合乎逻辑的方式(IMO)是这样的:
List<StatusMessage> messages = await (
from statusMessage in context.StatusMessages
join pvs in context.PageVirtualServer
on statusMessage.VirtualServerId = pvs.VirtualServerId
where pvs.StatusPageId == id
select statusMessage
).ToListAsync();