Eri*_*dke 3 c# linq asynchronous entity-framework
想象一下以下方法.
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);
}
Run Code Online (Sandbox Code Playgroud)
发生以下异常.."无法创建类型'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);
}
Run Code Online (Sandbox Code Playgroud)
有人可以解释这种行为吗?
在第一个示例中,您实现了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();
Run Code Online (Sandbox Code Playgroud)
但是,我强烈希望坚持使用一个查询.稍微更符合逻辑的方式(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();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
114 次 |
| 最近记录: |