C# LinQ: фильтрация объекта[] с элементами, содержащими строку (или ее часть) из строки[]C#

Место общения программистов C#
Ответить
Anonymous
 C# LinQ: фильтрация объекта[] с элементами, содержащими строку (или ее часть) из строки[]

Сообщение Anonymous »

У меня есть запрос «Лицензии», который возвращает объект Licenses[] следующим образом:

Код: Выделить всё

var licenses = await _licenseRepository.SearchAsync(ct); //=> CT = CancellationToken
и фильтр запросов, позволяющий фильтровать по идентификатору или имени:

Код: Выделить всё

public sealed record Filter(LicenseTypeValues[] Id, string[] Name);
Поэтому я должен иметь возможность передать строку[] в качестве фильтра «Имя» (например), и я должен вернуть каждую лицензию, имя которой содержит любое из имен в строке[] – или их часть.
Давайте рассмотрим следующий результат запроса лицензий без фильтра:

Код: Выделить всё

{
"count": 5,
"results": [
{
"id": 15005,
"name": "Windows 2012",
"maxCpu": null,
"parentId": 15032,
"created": "2021-02-16T08:17:45Z"
},
{
"id": 15027,
"name": "Windows 2016",
"maxCpu": null,
"parentId": 15032,
"created": "2021-02-16T08:17:45Z"
},
{
"id": 15030,
"name": "Windows 2022",
"maxCpu": null,
"parentId": 15032,
"created": "2021-08-11T10:29:36Z"
},
{
"id": 15032,
"name": "Ubuntu 23",
"maxCpu": null,
"parentId": 15,
"created": "2023-05-22T14:56:11.93Z"
},
{
"id": 15032,
"name": "Ubuntu 24",
"maxCpu": null,
"parentId": 15,
"created": "2023-05-22T14:56:11.93Z"
}
]
}
Тогда, если я передам фильтр, подобный следующему:

Код: Выделить всё

["Windows 201", "Ubuntu 23"]
Ответ должен быть таким:

Код: Выделить всё

{
"count": 3,
"results": [
{
"id": 15005,
"name": "Windows 2012",
"maxCpu": null,
"parentId": 15032,
"created": "2021-02-16T08:17:45Z"
},
{
"id": 15027,
"name": "Windows 2016",
"maxCpu": null,
"parentId": 15032,
"created": "2021-02-16T08:17:45Z"
},
{
"id": 15032,
"name": "Ubuntu 23",
"maxCpu": null,
"parentId": 15,
"created": "2023-05-22T14:56:11.93Z"
}
]
}
Моя первая попытка использовать простой LinQ с лямбда-выражением была:

Код: Выделить всё

var licenses = await _repository.FindAll().Where(x => filter.Name.Contains(x.Name)).ToArrayAsync();
Проблема этого запроса в том, что он работает только с точными совпадениями (например: «Windows 2019» или «Ubuntu 23»), но не с частичными совпадениями.
Конечно, я мог бы просто выполнить итерацию с помощью цикла foreach и фильтровать каждый элемент один за другим, но мне бы хотелось найти более элегантное решение с использованием LinQ, если это возможно.Есть предложения?

Подробнее здесь: https://stackoverflow.com/questions/788 ... part-of-it
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»