2015-08-24 2 views
0

У меня есть DataTable, который заполняется с использованием SQL-запроса. Если значения этого DataTable не обрезаны (слева и справа), программа не может найти правильные совпадения. Поэтому я ищу эффективный запрос LINQ (не два вложенных оператора foreach), чтобы обрезать все значения в DataTable и вернуть их чистую версию.Trim All Cells DataTable

+1

Не были бы ли вложенные заявления foreach хорошими и чистыми, почему у вас должен быть LINQ? –

+2

Не будет ли обрезка в БД лучшим, то есть более эффективным решением? LINQ, конечно же, не будет больше __efficient__, чем цикл, просто более стильный. – TaW

+0

Когда вы пытаетесь найти совпадение, вы можете обрезать в этот момент – jradich1234

ответ

3

Наиболее эффективный способ сделать это в базе данных, Fe:

SELECT RTRIM(LTRIM(ColumnName)) AS TrimmedColumn FROM TableName 

Если вы должны сделать это с C# самый производительный способ простой цикл (LINQ также использует петли):

DataColumn[] stringColumns = table.Columns.Cast<DataColumn>() 
    .Where(c => c.DataType == typeof(string)) 
    .ToArray(); 

foreach(DataRow row in table.Rows) 
    foreach(DataColumn col in stringColumns) 
     row.SetField<string>(col, row.Field<string>(col).Trim()); 

В общем, не используйте LINQ to , чтобы изменить источник. Запрос не должен вызывать побочные эффекты.

+0

Спасибо! Я использую ваше решение вместо LINQ. – Disasterkid

+0

Чтобы избежать ошибок нулевой ссылки, добавьте 'if (row [column]! = DBNull.Value)' –

1

Я не уверен, что вы можете применить оператор LINQ Select в DataTable и использовать Trim() для класса String для достижения своей цели. Но в качестве разработчика базы данных я бы предложил действовать в SQL Query и использовать поле Rtrim (Ltrim (field1)) AS1 в вашем запросе, чтобы избавиться от пробелов перед данным datatable.

Смежные вопросы