首页 > 解决方案 > 在其他 LINQ 查询中使用来自 LINQ 查询的结果的问题

问题描述

我正在尝试根据另一个表中的外键从表中选择元素。我的代码如下所示:

var account = await _context.Accounts.FirstAsync(a => a.Id == new Guid(id) && a.UserId == new Guid(user.Id));
if (account == null) return NotFound();

var detaillines = await _context.DetailLines.Where(d => new Guid(d.Account) == account.Id).ToListAsync();

它因错误而失败:

无法翻译 LINQ 表达式“DbSet .Where(d => new Guid(d.Account) == __account_Id_0)”。以可翻译的形式重写查询,或通过插入对 AsEnumerable()、AsAsyncEnumerable()、ToList() 或 ToListAsync() 的调用显式切换到客户端评估。有关详细信息,请参阅https://go.microsoft.com/fwlink/?linkid=2101038

为什么我无法在第一个查询中使用我在第二个查询中拥有的帐户的 ID?

更新:

对第二个 LINQ 查询的以下更改解决了它:

var detailLinesForAccount = _context.DetailLines
                .AsEnumerable()
                .Where(d => new Guid(d.Account) == account.Id).ToList();

标签: c#linqentity-framework-core

解决方案


new Guid(...)无法翻译。尝试将此代码用于第一部分:

var guide = new Guid(id);
var userGuid = new Guid(user.Id);

var account = await _context.Accounts.FirstAsync(a => a.Id == guide && a.UserId == userGuid);
if (account == null) return NotFound();

但是对于第二部分,您必须使用客户评估或更改设计或逻辑。客户评价:

var detaillines = await _context.DetailLines
    .AsEnumerable().Where(d => new Guid(d.Account) == account.Id).ToListAsync();

使用客户端评估时要小心,并考虑潜在的内存泄漏等。

更多详情:

客户端评估:如果查询中的顶级投影无法转换到服务器(提供者无法了解该方法是如何实现的),EF Core 将从服务器获取任何所需的数据并评估其余部分在客户端查询。(需要将所有数据拉入内存才能在客户端应用过滤器。)


推荐阅读