EF Core中使用CONTAINS查询包含匿名类型复合键列表失败的问题咨询
我现在遇到一个EF Core查询的棘手问题,想向大家求助:
我要查询的目标表有两个varchar类型的键列,首先我从另一个集合生成了包含200组键值对的列表,代码如下:
var compositeKeys = prcProjects.Select(p => new { key1 = p.Proposal!.ProposalNm.Trim().ToUpper(), key2 = p.ProjectNm.Trim().ToUpper() }).ToList();
之后我尝试用这个键值对列表来过滤目标表,使用Contains方法编写了查询:
t2DestRecs = await terContext.Tert002RcFps .Where(t => compositeKeys.Contains(new { key1 = t.RdwyCntrtId.Trim().ToUpper(), key2 = t.FinProjId.Trim().ToUpper() })) .ToListAsync();
但这段代码执行时直接抛出了异常,具体信息如下:
Exception parsing command line: System.InvalidOperationException: The LINQ expression '__compositeKeys_0 .Contains(new { key1 = StructuralTypeShaperExpression( StructuralType: TEREExtractLoad.Models.Sql.tere.Tert002RcFp ValueBufferExpression: ProjectionBindingExpression: EmptyProjectionMember IsNullable: False).RdwyCntrtId.Trim().ToUpper(), key2 = StructuralTypeShaperExpression( StructuralType: TEREExtractLoad.Models.Sql.tere.Tert002RcFp ValueBufferExpression: ProjectionBindingExpression: EmptyProjectionMember IsNullable: False).FinProjId.Trim().ToUpper() })' could not be translated. Either rewrite the query in a form that can be translated, or switch to client evaluation explicitly by inserting a call to 'AsEnumerable', 'AsAsyncEnumerable', 'ToList', or 'ToListAsync'. See https://go.microsoft.com/fwlink/?linkid=2101038 for more information.
我有点意外,毕竟这个匿名类型里只有字符串字段,我原本以为EF Core能把它翻译成SQL。我知道SQL Server没有直接对应的复合键Contains函数,但至少可以转成WHERE (key1=val1 AND key2=val2) OR (key1=val3 AND key2=val4)...这样的SQL语句吧?感觉这应该是个挺常见的场景,SQL Server和EF Core应该能支持才对。
想问问大家,你们遇到这种问题都是怎么解决的?难道真的要手动拼接一长串的OR条件吗?
内容来源于stack exchange

