如何解决LINQ表达式错误无法翻译
我在尝试执行查询时遇到此错误。
System.InvalidOperationException: .where(ti =>(int)ti.Inner.OptionType == 1 && ti.Inner.QualifierId == null && ti.Inner.CreditingMethod!=“ xxx” && __ToList_0 .Any(e => e.Vdate ==(Nullable)ti.Outer.ADate))'无法翻译。以一种可以翻译的形式重写查询,或者通过插入对AsEnumerable(),AsAsyncEnumerable(),ToList()或ToListAsync()的调用来显式切换到客户端评估。有关更多信息,请参见https://go.microsoft.com/fwlink/?linkid=2101038。
我正在填充的对象是
public class OCList
{
public DateTime? Vdate{ get; set; }
public Double? VWeight{ get; set; }
}
/// example of adding to the list
List<OCList> ocList= new List<OCList>();
if (request.Date1 != null && request.Weight1 != null)
{
ocList.Add(new OCList{ Vdate = request.Date1.Value,VWeight = request.Weight1.Value });
}
错误在这里:
&& ocList.ToList().Any(e => e.Vdate == x.Tb2.ADate))
Linq表达式:
var results = _context.Tb1
.Join(_context.Tb2,oc => oc.OptionId,o => o.OptionId,(oc,o) => new { OptionCost = oc,Option = o })
.Where(x => x.Tb2.Val1 == 1
&& x.Tb2.Val2 == null
&& ocList.ToList().Any(e => e.Vdate == x.Tb2.ADate))
////.........
解决方法
在此处检查客户端和服务器端评估:https://docs.microsoft.com/en-us/ef/core/querying/client-eval
EF Core在顶级投影中支持部分客户评估(实际上是对Select()的最后一次调用)。如果查询中的顶级投影无法转换到服务器,则EF Core将从服务器获取所有必需的数据,并在客户端上评估查询的其余部分。如果EF Core在顶级投影之外的任何其他位置检测到无法转换到服务器的表达式,则它将抛出运行时异常。
您的ToList
和Any
无法转换为sql,因此您会收到错误消息。
这可以工作
var results = _context.Tb1
.Join(_context.Tb2,oc => oc.OptionId,o => o.OptionId,(oc,o) => new { OptionCost = oc,Option = o })
.AsEnumerable()
.Where(x => x.Tb2.Val1 == 1
&& x.Tb2.Val2 == null
&& ocList.ToList().Any(e => e.Vdate == x.Tb2.ADate))
但是它将首先从服务器获取所有内容,然后应用where
子句,从而导致性能下降。
您可以像这样使它变得更好
var results = _context.Tb1
.Join(_context.Tb2,Option = o })
.Where(x => x.Tb2.Val1 == 1
&& x.Tb2.Val2 == null)
.AsEnumerable()
.Where(ocList.ToList().Any(e => e.Vdate == x.Tb2.ADate))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。