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

有人能解释这种行为吗?

C#加入了列表.林克.无法创建常量类型

在第一个示例中,您在内存中具体化了一个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();