#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();