我正在使用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
我想念的是什么?
答案 0 :(得分:0)
使用os.read
代替List<string>
解决了问题。
有关更多信息,请参见:
https://github.com/StefH/System.Linq.Dynamic.Core/issues/61
这不是错误。
原因是测试失败,因为您在 Where子句作为参数。这实际上意味着如果您提供 像{“ A001”,“ D444”}这样的数组,代码尝试将@ 0替换为“ A001”, 并尝试用“ D444”替换@ 1,依此类推。但是你只定义了 @ 0。