EF Dynamic содержит не работает, как ожидалось - PullRequest
2 голосов
/ 03 июля 2019

Я использую EntityFramework и библиотеку System.Linq.Dynamic.Core для динамического выбора записей на основе массива значений.

Отлично работает для int[], но возвращает фанк SQL с string[].

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 голосов
/ 05 июля 2019

использование List<string> вместо string[] решает проблему.

Для получения дополнительной информации см. Также:

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

Это неошибка.

Причина заключается в том, что тестирование завершается неудачно, поскольку вы предоставляете массив в предложении Where в качестве параметров. Это фактически означает, что если вы предоставляете массив типа {"A001", "D444"},код пытается заменить @ 0 на «A001», и пытается заменить @ 1 на «D444» и так далее.Но вы только определили @ 0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...