gpt4 book ai didi

C# 加入列表。 LINQ。无法创建常量类型

转载 作者:行者123 更新时间:2023-11-30 14:51:45 25 4
gpt4 key购买 nike

想象一下下面的方法。

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

关于C# 加入列表。 LINQ。无法创建常量类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33597905/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com