【发布时间】:2020-12-03 09:37:51
【问题描述】:
我有一个实体框架控制器,它已成功使用以下方法。但是,我最近更新了我的项目以使用 .NET Core 3.1,它一定有什么问题。
我现在收到此错误:
FirstOrDefault()' 无法翻译。以可翻译的形式重写查询,或通过插入对 AsEnumerable()、AsAsyncEnumerable()、ToList() 或 ToListAsync() 的调用显式切换到客户端评估
我做了一些研究,有人说不要使用我在下面的查询中所做的GroupBy 扩展名。我试图将其取出,但这只会产生更多错误。
我也去了this:
但我不知道如何修复下面的复杂查询。
老实说,我不确定它为什么会失败或如何正确修复它。
有没有人觉得有什么不对?
谢谢!
public async Task<ActionResult<object>> GetStarChemicalData(string starID)
{
var starChemicalData = await (from starlist in _context.StarList
join ql in _context.ChemicalList on starlist.ChemicalId equals ql.ChemicalId into stars
from chemicallist in stars.DefaultIfEmpty()
join qc in _context.ChemicalAtoms on chemicallist.ChemicalId equals qc.ChemicalId into chemicals
from chemicalatoms in chemicals.DefaultIfEmpty()
join nk in _context.StarLinks on chemicalatoms.AtomId equals nk.AtomId into links
from starlinks in links.DefaultIfEmpty()
where starlist.StarId == starID
select new
{
StarId = starlist.StarId,
StarType = starlist.StarType,
StarTitle = starlist.StarTitle,
ChemicalId = starlist.ChemicalId,
AtomId = (Guid?)chemicalatoms.AtomId,
OrderId = chemicalatoms.OrderId,
ChemicalText = chemicallist.ChemicalText,
AtomText = chemicalatoms.AtomText,
Wavelength = chemicalatoms.Wavelength,
isRedShifted = (starlinks.AtomId != null && starlist.StarType == 1) ? 1
: (starlinks.AtomId == null && starlist.StarType == 1) ? 0
: (int?)null
})
.GroupBy(x => x.StarId)
.Select(g => new
{
StarId = g.FirstOrDefault().StarId,
StarType = g.FirstOrDefault().StarType,
StarTitle = g.FirstOrDefault().StarTitle,
ChemicalId = g.FirstOrDefault().ChemicalId,
ChemicalText = g.FirstOrDefault().ChemicalText,
ChemicalAtoms = (g.FirstOrDefault().AtomId != null ? g.Select(x => new
{
AtomId = x.AtomId,
OrderId = x.OrderId,
AtomText = x.AtomText,
Feedback = x.Wavelength,
IsCorrect = x.isRedShifted
}) : null)
}).FirstOrDefaultAsync();
return starChemicalData;
调试后出错:
.Select(x => new {
AtomId = x.AtomId,
OrderId = x.OrderId,
AtomText = x.AtomText,
Feedback = x.Wavelength,
IsCorrect = x.isRedShifted
})' could not be translated.
【问题讨论】:
-
使用导航属性重写查询。然后很可能你会发现它不需要有问题的
GroupBy。当前查询看起来很复杂,因为它使用转换为 LINQ 的 SQL 方法,而它应该是其他方式。查看当前查询,我希望得到一些简单的东西,例如_context.StarList.Select(sl => new { sl.StarId/, * other sl properties ...*/, ChemicalAtoms = sl.ChemicalAtoms.Select(ca => new { ca.AtomId/, * other ca properties ...*/ }) }) -
我查看了 Microsoft 文档,试图弄清楚导航属性是什么。那么它们只是不在数据库中的类吗?此外,我的 GroupBy 使用 id (StarId)。该 ID 在数据库中。所以我不太确定如何进行。
-
@IvanStoev 我花了一些时间尝试按照使用建议重写查询。但是 ChemicalAtoms 不是 StartList 的一部分。 ChemicalAtoms 来自一个连接。所以我不能按照你的建议做;即:sl.ChemicalAtoms.Select(...)
标签: entity-framework linq entity-framework-core iqueryable asp.net-core-3.1