Поиск, существуют ли два значения для одного и того же идентификатора в dataset

#c# #asp.net #.net #linq

#c# #asp.net #.net #linq

Вопрос:

у меня есть результирующий набор таблицы данных, содержащий два столбца, на которых мне нужно сфокусироваться ActionCode и ProcessId

Я пытаюсь найти самый быстрый способ проверить, есть ли оба AcitonCodes A и E, оба для одного и того же ProcessId.

я нахожу все эти примеры того, как искать значение в таблице данных, но не могу понять, как ограничить его одним и тем же идентификатором. пожалуйста, помогите.

сейчас это работает таким образом, что возвращает все строки A и E, но, похоже, я не могу найти способ вернуть результат, только если A и E оба принадлежат одному и тому же ProcessId.

 DataRow[] foundAuthors = dt.Select("ActionCode = '"   'A'   "' or ActionCode = '"   'E'   "'" );
  

и

 var x = from e in dt.AsEnumerable()
                                where e.Field<int>("ActionCode") == 'A' amp;amp;
                                      e.Field<int>("SeriesID") == seriesid
                                select e;
  

и последний вопрос. является ли LINQ оптимальным способом для этого? существует ли «более новое» и предпочтительное пространство имен, которое я должен использовать?
Спасибо!

Ответ №1:

Без IDE я получил следующий фрагмент LINQ, который может потребовать настройки:

     dt[0].Rows.Cast<DataRow>()
    .Select(r => new { pID = (long)r["ProcessID"], action = (string)r["ActionCode"] })
    .Where(x => x.action == "A" || x.action == "E")
    .GroupBy(x => x.pID, x => x.action)
    .Where(g => new []{"A","E"}.Intersect(g).Count() == 2)
    .Select(g => g.Key);
  

Ответ №2:

Это должно дать вам то, что вы ищете (Вот полный пример DotNetFiddle из приведенного ниже):

     string[] myList = new string[]{"A", "E"};

    var results = authors.Where(x => myList.Contains(x.ActionCode))
                        .GroupBy(x => x.ProcessId, x => x.ActionCode)
                        .Where(d => myList.All(dv => d.Contains(dv)))
                        .Select(x => new { ProcessId = x.Key, ActionCode = x.ToList()} ).ToList();