2014-09-16 2 views
1

Я хотел бы выбрать столбцы DataTable, которые начинаются с буквы в C#. Я должен сделать это, используя Sort Property. Я только нашел, как сортировать их по возрастанию или по убыванию.Пользовательские столбцы DataTable в C#

Результат сортировки должен быть эквивалентен оператору выбора sql с LIKE 'l%', l в качестве параметра. Я мог бы извлечь первую букву с помощью подстроки, но как ее использовать? Благодарю.

DataView dv= employees.DefaultView; 
dv.Sort="ColumnName asc"; 
employees = dv.ToTable(); 

P.S .: Также найдено около RowFilter собственности, но мне нужно использовать 'Сортировать'.

Извините за то, что не очень ясны в первый раз.

+0

Зачем вам нужно использовать свойство 'Sort' и не использовать LINQ? Зачем это вам вообще нужно, так как 'Sort =" ColumnName asc "' порядки по полному полю, включая первую букву. Поэтому разница должна быть предельной. –

+0

После сортировки мне нужно выбрать только те, которые начинаются с данной буквы. Использование 'Sort' является требованием, поэтому я ищу решение, которое содержит его. –

+0

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

ответ

3

Вы можете использовать LINQ-To-DataTable вместо:

employees = employees.AsEnumerable() 
    .OrderBy(row => row.Field<string>("ColumnName").FirstOrDefault()) 
    .CopyToDataTable(); 

Обратите внимание, что вам нужно добавить using System.Linq в верхней части файла.

Может быть, вы найдете синтаксис запроса более читабельным:

var rows = from row in employees.AsEnumerable() 
      let value = row.Field<string>("ColumnName") 
      orderby value.FirstOrDefault() 
      select row; 
employees = rows.CopyToDataTable(); 

UPDATE: «После сортировки, нужно выбрать только те, которые начинаются с данной буквы»

Тогда вы, вероятно, хотите для фильтрации записей, поэтому используйте Enumerable.Where:

Так или:

employees = employees.AsEnumerable() 
    .Where(row => row.Field<string>("ColumnName").StartsWith("A", StringComparison.CurrentCultureIgnoreCase)) 
    .OrderBy(row => row.Field<string>("ColumnName").FirstOrDefault()) 
    .CopyToDataTable(); 

или (тот же синтаксис запроса):

var rows = from row in employees.AsEnumerable() 
      let value = row.Field<string>("ColumnName") 
      where value.StartsWith("A", StringComparison.CurrentCultureIgnoreCase)) // for example 
      orderby value.FirstOrDefault() 
      select row; 
employees = rows.CopyToDataTable(); 

Однако теперь orderby довольно бессмысленно, так как вы хотите заказать записи по первой букве, которые начинаются все с той же буквы в любом случае.

0

здесь используется старая DataTable и сортировка обертки, которую я использовал. теперь я использую другой класс, который преобразует datatable в пользовательский объект и может легко использовать linq.

public static class CTableManager 
{ 
    public static DataTable Select(DataTable dt, string sFilter) 
    { 
     DataTable dtResult = dt.Clone(); 

     try 
     { 
      dtResult = dt.Select(sFilter).CopyToDataTable(); 
     } 
     catch { } 

     return dtResult; 
    } 

    public static DataTable Sort(DataTable dt, string sOrder) 
    { 
     DataTable dtResult = dt.Clone(); 

     try 
     { 
      dt.DefaultView.Sort = sOrder; 

      dtResult = dt.DefaultView.ToTable().Copy(); 
     } 
     catch { } 

     return dtResult; 
    } 

    public static DataTable SelectAndSort(DataTable dt, string sFilter, string sOrder) 
    { 
     DataTable dtResult = dt.Copy(); 

     if (sFilter != string.Empty) 
     { 
      dtResult = Select(dtResult, sFilter); 
     } 

     if (sOrder != string.Empty) 
     { 
      dtResult = Sort(dtResult, sOrder); 
     } 

     return dtResult; 
    } 
} 

использование:

Нормальный, где фильтр в SQL

var myResult = CTableManager.Select(dtSource,"itemDesc like '%plastic%' AND Price > 25.97"); 

Этакая снова SQL как

var myResult = CTableManager.Sort(dtSource,"Price DESC, Quantity ASC"); 

и, очевидно, как

var myResult = CTableManager.SelectAndSort(dtSource,"itemDesc like '%plastic%' AND Price > 25.97", "Price DESC, Quantity ASC"); 
Смежные вопросы