2017-02-14 4 views
0

Нужна помощь с Linq.Linq Datatable подмножество, использующее группу и имеющее счет> 1

У меня есть DataTable, который выглядит следующим образом I just have the W_text with me to search

Используя выше DataTable, я хотел бы, чтобы извлечь набор строк, имеющих следующий результат

The key to search is "First Employee"

Так как вы можете see, я хочу получить подмножество тех строк, которые имеют значения W_Text как «First» и «Employee», но имеющие один и тот же l_id.

В терминах БД это будет выбор * из таблицы 1, где W_Text в ('First', 'Employee') группе l_id имеет l_id> 1 (или что-то вроде этого).

Как достичь этого в C# с использованием данных?

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

var results = from myRow in dtResult.AsEnumerable() 
       where myRow.Field<string>("W_Text") == "First" || 
        myRow.Field<string>("W_Text") == "Employee" 
       select myRow; 

dtCopy = results.CopyToDataTable(); 

ответ

0

Проверьте следующее:

 List<string> wTextFilter = new List<string>(); 
     wTextFilter.Add("First"); 
     wTextFilter.Add("Employee"); 

     // Get all Id's that satisfy all conditions:    
     List<int> results = dt.AsEnumerable() 
      // Get all Id's: 
      .Select(dataRow => dataRow.Field<int>("l_id")) 
      // Filter the Id's : 
      .Where(id => 
       // the Id should be greater than one. 
        id > 1 && 
        // check if all W_Text entries has a record in the datatable with the same Id. 
        wTextFilter.All(W_Text => dt.AsEnumerable().Any(dataRow => dataRow.Field<string>("W_Text") == W_Text && dataRow.Field<int>("l_id") == id))) 
        .Distinct().ToList(); 

     // Get all datatable rows filtered by the list of Id's. 
     DataTable dtCopy = dt.AsEnumerable().Where(dataRow => results.Contains((dataRow.Field<int>("l_id")))).CopyToDataTable(); 
+0

Thanks Abdhulla. Это также дает мне набор данных со всеми появлениями «Первый» и «Сотрудник». Мне нужен только тот набор данных, где оба «First» и «Employee» оба существуют для одного и того же l_id, другими словами, где count (l_id) is> 1 – DevNovice

+0

Проверьте приведенный выше фрагмент кода после нового редактирования. –

+0

Работал блестяще! Большое спасибо Абдхулле. Очень ценю ваш ответ. Не могли бы вы помочь мне понять, как работает код? Я с трудом понимаю Linq особенно с этими совокупными функциями. Еще раз спасибо! – DevNovice

0

Привет вы можете использовать, как это, как показано

var results = (from myRow in dtResult.AsEnumerable() 
       where myRow.Field<string>("W_Text") == "First" || 
       myRow.Field<string>("W_Text") == "Employee" 
       select myRow).ToLookup(item => item.Field<string>("l_id")); 

ИЛИ

var results = (from myRow in dtResult.AsEnumerable() 
       where myRow.Field<string>("W_Text") == "First" || 
       myRow.Field<string>("W_Text") == "Employee" 
       select myRow).GroupBy(item => item.Field<string>("l_id")).ToList(); 
+0

Спасибо за ваш быстрый ответ вара. Хотя это теперь показывает количество результатов как то же самое, что и подмножество, но я не могу сделать копию в Datatable. Не могли бы вы рассказать мне, как пройти через переменную результатов? Я также смотрю, как мы говорим, но ваша помощь будет высоко оценена. – DevNovice

+0

извините за задержку, проверьте эту ссылку http://stackoverflow.com/questions/24566246/linq-grouping-query-to-datatable – Vara

+0

Еще раз спасибо Vara, однако ваш ответ возвращает все значения l_id, содержащие текст «First »или« Сотрудник ». Мне просто нужен уникальный l_id, который содержит как «First», так и «Employee». Еще раз спасибо – DevNovice