2016-04-21 7 views
1

Ich habe auf Google gesucht, aber keine Lösung gefunden. Bitte, bitte hilf mir.Wählen Datensatz zwischen zwei Spalte von DataTable

Problem:

Ich habe drei Säulen: ID, Value1 und Value2 im Datatable.

DataTable sieht wie folgt aus:

ID Value1 Value2 
1  10  20 
2  15  30 

ich die Daten zwischen einem bestimmten Bereich finden möchten. Lassen Sie mich klarstellen, indem ein Beispiel zeigt:

Wenn ich den Wert 15 bis 30 eingeben, es nicht zulassen sollte, da 15 bereits zwischen 10 bis 20.

Dies ist der Code vorhanden ist, habe ich geschrieben wenn ich den gleichen Wert erneut eingeben, dann werde ich die Meldung:

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 
} 

Also, wie schreibe ich den Code meine Aufgabe zu erreichen, wie ich oben erklärt haben?

+1

Was bedeutet "wenn ich 15 bis 30 eingeben"? Benutzereingabe von zwei Zahlen? Wo sind diese beiden Variablen in Ihrer Anfrage? Ist 'drCurrentRow' eine weitere DataRow? Möchten Sie zwei DataTables miteinander vergleichen? Nicht klar. –

Antwort

2

Ersetzen Sie einfach die == mit >= und <=:

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

Vielen Dank, geschätzte ... –

+0

Froh, zu helfen :-) –

2

Sie besser eine einfache Schleife verwenden würde, um zu überprüfen, ob die angegebenen Werte in vorhandenen Zeilen dargestellt werden. Es ist so etwas wie;

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

Vielen Dank, Wirklich Sie Leute sind fantastisch. –

1

So haben Sie eine DataRow mit zwei Werten v1 und v2, und Sie wollen, wenn ein DataTable bereits Zeilen enthält, wo row.Value1 <= v1 und row.Value2 > v1 oder row.Value1 < v2 und 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

Vielen Dank, jetzt Konzept sind sehr klar. –

Verwandte Themen