EF动态包含无法正常工作

时间:2019-07-03 15:29:07

标签: entity-framework linq

我正在使用EntityFramework和库'System.Linq.Dynamic.Core'来基于值数组动态选择记录。

它对于int[]正常工作,但它返回带有string[]的时髦SQL。

var whereQuery = _context.Registrations.AsQueryable();

int[] intArray = new[] {1, 2, 3};
string[] array = new[] {"A001", "D444"};

whereQuery = whereQuery.Where($"@0.Contains(RegistrationId)", intArray);
whereQuery = whereQuery.Where($"@0.Contains(Code)", array);

调试时,我看到它生成了以下SQL语句

...
FROM [dbo].[Registrations] AS [Extent1]
WHERE ([Extent1].[RegistrationId] IN (1, 2, 3)) 
AND (( CAST(CHARINDEX([Extent1].[Code], N'A001') AS int)) > 0)

对于int[],它会生成正确/预期的“ IN语句”。

对于string[],它仅检查数组中的第一个值。我希望:

AND ([Extent1].[Code] IN (N'A001', N'D444'))

版本:

System.Linq.Dynamic.Core v1.0.14.0(运行时v4.0.30319)

EntiftyFramework v6.0.0.0

我想念的是什么?

1 个答案:

答案 0 :(得分:0)

使用os.read代替List<string>解决了问题。

有关更多信息,请参见:

https://github.com/StefH/System.Linq.Dynamic.Core/issues/61

  

这不是错误。

     

原因是测试失败,因为您在   Where子句作为参数。这实际上意味着如果您提供   像{“ A001”,“ D444”}这样的数组,代码尝试将@ 0替换为“ A001”,   并尝试用“ D444”替换@ 1,依此类推。但是你只定义了   @ 0。