![](/img/trans.png)
[英]Create combined DataTable from two DataTables joined with LINQ. C#
[英]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.