2016-04-21 6 views
1

Я искал в Google, но не нашел никакого решения. Пожалуйста, помогите мне.Выберите запись между двумя столбцами из DataTable

Проблема:

У меня есть три колонки: ID, Value1 и Value2 в Datatable.

DataTable выглядит следующим образом:

ID Value1 Value2 
1  10  20 
2  15  30 

Я хочу найти данные между определенным диапазоном. Позвольте мне пояснить, показывая пример:

Если я ввожу значение 15 до 30 лет, она не должна позволить, потому что 15 уже присутствует от 10 до 20.

Это код, который я написал , если я снова ввести такое же значение, то я получаю сообщение:

bool inRange = dtCurrentTable.AsEnumerable() 
    .Any(row => Convert.ToInt32(drCurrentRow["Value1"]) == row.Field<Int32<("Value1") 
      && Convert.ToInt32(drCurrentRow["Value2"]) == row.Field<Int32>("Value2")); 
if (inRange) 
{ 
    //msg 
} 

Итак, как я пишу код, чтобы достичь своей задачи, как я объяснил выше?

+1

Что означает «если я вхожу от 15 до 30»? Пользовательский ввод двух чисел? Где эти две переменные в вашем запросе? Является ли 'drCurrentRow' еще одним DataRow? Вы хотите сравнить две таблицы данных? Не совсем понятно. –

ответ

2

Просто замените == с >= и <=:

if (dtCurrentTable.AsEnumerable().Any(row => 
     (
     Convert.ToInt32(drCurrentRow["Value1"]) <= row.Field<Int32>("Value1") && 
     Convert.ToInt32(drCurrentRow["Value2"]) >= row.Field<Int32>("Value1") 
    ) 
     || 
     ( 
     Convert.ToInt32(drCurrentRow["Value1"]) <= row.Field<Int32>("Value2") && 
     Convert.ToInt32(drCurrentRow["Value2"]) >= row.Field<Int32>("Value2") 
    ) 
    ) 
    { 
    // value1 or value2 falls within an already existing range 
    } 
+0

Спасибо большое, оценил ... –

+0

Рад помочь :-) –

2

Вы бы лучше использовать простой цикл, чтобы проверить, если данные значения представлены в существующих строках. Это что-то типа;

foreach (DataRow row in dt.Rows) 
     { 
      int val1 = Convert.ToInt32(row["Value1"]); 
      int val2 = Convert.ToInt32(row["Value2"]); 

      if (someValue>=val1 && someValue<=val2) 
      { 
       // do not insert 
      } 
     } 
+0

Спасибо большое, на самом деле вы люди потрясающие. –

1

Так у вас есть DataRow с два значения v1 и v2, и вы хотите посмотреть, если DataTable уже содержит строки, в которых row.Value1 <= v1 и row.Value2 > v1 или row.Value1 < v2 и row.Value2 >= v2?

int v1 = row.Field<int>("Value1"); 
int v2 = row.Field<int>("Value2"); 

var inRangeRows = from r in dtCurrentTable.AsEnumerable() 
        where (r.Field<Int32>("Value1") <= v1 && r.Field<Int32>("Value2") > v1) 
        || (r.Field<Int32>("Value1") < v2 && r.Field<Int32>("Value2") >= v2) 
        select r; 

bool inRange = inRangeRows.Any(); 
+0

Большое вам спасибо, теперь концепция очень ясна. –

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