You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

EF Core中使用CONTAINS查询包含匿名类型复合键列表失败的问题咨询

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.07 07:23:10