Подтвердить что ты не робот

Как обращаться с CopyToDataTable(), когда нет строк?

У меня есть код:

dt = collListItems.GetDataTable().AsEnumerable()
        .Where(a => Convert.ToString(a["Expertise"]).Contains(expertise) && Convert.ToString(a["Office"]) == office)
         .CopyToDataTable(); 

filteredCount = dt.Rows.Count();

Как лучше всего обработать событие, если нет строк, которые соответствуют? В настоящее время я получаю "Источник не содержит DataRows", но в этом случае я хочу, чтобы filterCount был равен 0.

Спасибо заранее.

Изменить: я знаю, что try..catch работает, но есть ли более элегантный способ?

4b9b3361

Ответ 1

Конечно, вы не хотите использовать try/catch для этого. Try/Catch следует использовать в действительно исключительных обстоятельствах, вы не хотите, чтобы он управлял вашим потоком управления. Практически во всех ситуациях существуют лучшие методы, которые встроены прямо в язык/библиотеку или требуют минимальных усилий для кодирования.

В этом случае вы хотите захватить таблицу заранее, чтобы вы не вызывали метод GetDataTable() больше времени, чем необходимо, потому что нам это понадобится, если запрос не содержит никаких результатов. Вы также можете включить ToList() в запрос, если сам запрос является дорогостоящим или долговечным, поэтому вам нужно сделать это только один раз.

Впоследствии, это вопрос тестирования, если в результате есть какие-либо строки. Если это так, вы можете безопасно скопировать в datatable. В противном случае просто клонируйте структуру исходной таблицы (не включайте строки), так что в любом случае у вас есть правильная структура таблицы и вы можете проверить количество строк, привязать ее к элементу управления и т.д., И нет сюрпризы.

var table = collListItems.GetDataTable();    
var rows = table.AsEnumerable().Where(...); // optionally include .ToList();
var dt = rows.Any() ? rows.CopyToDataTable() : table.Clone();
int filteredCount = dt.Rows.Count;

Ответ 2

вы можете сначала судить, есть ли строки, которые соответствуют:

var rows = collListItems.GetDataTable().AsEnumerable()
        .Where(a => Convert.ToString(a["Expertise"]).Contains(expertise) && Convert.ToString(a["Office"]) == office);
DataTable dt = table.Clone();
if (rows.Count() > 0)
    dt = rows.CopyToDataTable();

Ответ 3

Я думаю, что это будет более простое решение:

var Adj = (from c in View.AdjustmentsDataSource.AsEnumerable()
            where c["Adjustment"] != System.DBNull.Value
            select c);

if (Adj == null || Adj.Count() == 0)
     return;

DataTable dtChanges = Adj.CopyToDataTable();

Ответ 4

var results = from myRow in dtL1Users.AsEnumerable()
                                          where (Convert.ToInt32(myRow["No_x0020_of_x0020_L1_x0020_Remin"]) >= Convert.ToInt32(maxL1Escalation) && Convert.ToDateTime(myRow["L2_x0020_Last_x0020_Escalated_x0"]) < DateTime.Now.Date.AddDays(-Convert.ToInt32(reminderinterval)))
                                          select myRow;

                            foreach (var v in results)
                            {
                                collEligible = results.CopyToDataTable<DataRow>();
                                break;
                            }

Ответ 5

Как насчет этого решения:

            DataRow[] filtered_rows = data.Tables[0].Select(filter_string);

            if(filtered_rows.Length > 0)
            {
                filtered_data = filtered_rows.CopyToDataTable();
            }
            else
            {
                filtered_data.Clear();
            }

data.Tables[0] - это исходная таблица, а filtered_data - результирующая таблица.