C# Использование запроса linq для фильтрации значений в массиве - PullRequest
0 голосов
/ 20 апреля 2020

Я борюсь с этим Linq запросом, который запрашивает базу данных.

var roles = _context.Schools
                    .Select(x =>
                            new SelectListItem
                            {
                                Value = x.SchoolId.ToString(),
                                Text = x.SchoolNamePostCode
                            });

Мой запрос в настоящее время получает целые строки школ в SelectListItem. Однако то, что я пытаюсь сделать, это добавить предложение Where, которое содержит массив идентификаторов строковых значений.

string[] AssociatedSchoolsArray = AssociatedSchoolIDs.Split(",");

Переменная AssociatedSchoolsArray содержит массив, например, "1","3"

Итак, в моем исходном запросе Linq я хочу отфильтровать SelectListItem для SchoolIds 1 и 3 только

как мне добиться это?

Большое спасибо

Ответы [ 4 ]

4 голосов
/ 20 апреля 2020

Вы можете использовать, где для этого, например,

   var roles = _context.Schools
                .Where(c=>c.SchoolId == 1 || c.schoolId == 3)
                .Select(x =>
                        new SelectListItem
                        {
                            Value = x.SchoolId.ToString(),
                            Text = x.SchoolNamePostCode
                        });

или, конечно, также впоследствии;

   var roles = _context.Schools
                .Select(x =>
                        new SelectListItem
                        {
                            Value = x.SchoolId.ToString(),
                            Text = x.SchoolNamePostCode
                        })
                .Where(c=>c.Value == "1" || c.Value == "3");

На основе списка значений:

   var searchWords = new List<string>(new [] { "1", "2"});
   var roles = _context.Schools
                .Select(x =>
                        new SelectListItem
                        {
                            Value = x.SchoolId.ToString(),
                            Text = x.SchoolNamePostCode
                        })
                .Where(c=>searchWords.Contains(c.Value));

примечание; вместо содержимого вы также можете использовать .Any(). Он более гибкий, так как требует делегата, но поскольку .Contains() является методом, присущим объекту коллекции, может быть быстрее. С точки зрения EF и linq на sql, все это в любом случае переводится на SQL запрос, поэтому я сомневаюсь, что это важно.

3 голосов
/ 20 апреля 2020

.Contains метод сгенерирует ... WHERE column IN (1, 2, 3) sql запрос

Предположим, что SchoolId имеет тип int, поэтому вам нужно сначала разобрать строковые идентификаторы в целое число.

var selectedIds = Array.ConvertAll(AssociatedSchoolIDs.Split(","), int.Parse);

var items = _context.Schools
    .Where(school => selectedIds.Contains(school.SchoolId))
    .Select(school => new SelectListItem
        {
            Value = x.SchoolId,
            Text = x.SchoolNamePostCode
        })
    .ToArray();
2 голосов
/ 20 апреля 2020

Кажется, что SchoolId хранится в базе данных как int, поэтому вам нужно сначала преобразовать его в int перед выражением where, чтобы ускорить выполнение.

int[] AssociatedSchoolsArray = AssociatedSchoolIDs.Split(",").Select(item => Int32.Parse(item).ToArray();
var roles = _context.Schools.Where(item => AssociatedSchoolsArray.Contains(item.SchoolId))
                .Select(x =>
                        new SelectListItem
                        {
                            Value = x.SchoolId.ToString(),
                            Text = x.SchoolNamePostCode
                        });
1 голос
/ 20 апреля 2020

Добавляя к другим замечательным ответам, вот способ сделать это с помощью синтаксиса запроса LINQ:

var AssociatedSchoolIDs = "1,3";

var selectedIds = AssociatedSchoolIDs
    .Split(",")
    .Select(x => int.Parse(x));

var roles = (from school
             in _context.Schools
             where selectedIds.Contains(school.SchoolId)
             select new SelectListItem
             {
                 Value = school.SchoolId,
                 Text = school.SchoolNamePostCode
             }).ToArray();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...