繁体   English   中英

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

[英]C# joined lists. LINQ. unable to create a constant type

想象一下以下方法。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM