2016-11-15 1 views
0

Ich habe eine Standard-Datentabelle beim Laden der Seite, weiter, wenn ich die Dropdown-Auswahl auf meiner Seite ändern Ich möchte die vorhandene Datentabelle mit den ausgewählten Dropdown-Werte durchlaufen.Linq Abfrage mit .Contains keine Datensätze zurückgeben

Da meine Dropdown-Menüs Mehrfachauswahl-Dropdown-Menüs sind, besteht eine gute Möglichkeit, mehrere Werte zu senden, um die Datentabelle zu wiederholen.

Für dieses Szenario habe ich die Linq Qery auf der Standard-Datentabelle verwendet. So:

var zones = from myRow in ds.Tables[1].AsEnumerable() 
      where myRow.Field<string>("BusinessUnitId").Contains(BUIds) 
      select myRow; 
dt = zones.CopyToDataTable<DataRow>(); 

Es funktioniert perfekt für einzelnen Wert des Dropdown. Wenn jedoch mehrere IDs übergeben werden, gibt die Abfrage keine Zeilen zurück.

Hinweis: BUIds ist ein String-Variable (Beispiel: "1,2").

Kann mir jemand sagen, was ich in meinem Code bin fehle?

+0

Was genau BUIds in Ihrem Fall ist? Könnten Sie bitte ein detaillierteres Beispiel für die Daten geben, auf denen Sie testen? –

+0

String.Contains wird als wahr ausgewertet, wenn die Zeichenfolge genau die angegebene Teilzeichenfolge enthält (keine der einzelnen Zahlen aus BUIDs), in Ihrem Beispiel "0,1,2,3". Enthält ("1,2") ist gleich wahr , aber "0,2,1,3" .Contains ("1,2") ist gleich falsch. –

Antwort

5

Du Enthält an der falschen Stelle verwendet wird, sollte es auf den BUIds sein:

var ids = BUIds.Split(','); // get an Id array 
var zones = from myRow in ds.Tables[1].AsEnumerable() 
      where ids.Contains(myRow.Field<string>("BusinessUnitId")) 
      select myRow; 
dt = zones.CopyToDataTable<DataRow>(); 
0

die folgende Version Betrachten Hashset mit:

var idsHashset = new HashSet<string>(BUIds.Split(',')); 

var zones = from myRow in ds.Tables[1].AsEnumerable() 
       where idsHashset.Contains(myRow.Field<string>("BusinessUnitId")) 
       select myRow; 
    dt = zones.CopyToDataTable<DataRow>(); 

Dies wird für die einzelnen Wert arbeiten wählen und mehrere Wert auswählen.

Wie es funktioniert:

  • BUIds, die eine string ein string[] holen ist, mit split, wo Elemente getrennt verwenden ,
  • nun, ob Array enthält 1 oder viele Elemente, würde dies immer in der Lage sein, mit demselben Code zu arbeiten
  • Wenn die Anzahl der IDs groß ist, sollten Sie einen Hashset<string> für einen O(LogN) understellenfür O(1) Suche
0

Mit Lambda

var zones = ds.Tables[1].AsEnumerable().Where(row => BUIds.Split(',').Contains((string) row["BusinessUnitId"]); 
Verwandte Themen