2012-05-04 14 views
5

Porównaj To nie działa tutaj dla mnie.Jak porównać ciągi w zapytaniu Linq

mojej kwerendy LINQ jest

var result = from c in customers 
      where c.CustomerID.CompareTo(txtSerchId.Text) >= 0 
      select` c; 

i em coraz wyjątek

////// EXCEPTION ///////////

System.ArgumentException was caught 
Message=Value does not fall within the expected range. 

My kod jest podobny do tego:

var result = 
    from c in customers 
    where c.CustomerID.CompareTo(txtSerchId.Text) >= 0 
    select c; 

if (result != null) 
{ 
    IEnumerator<Customer> resultEnum = result.GetEnumerator(); 
    while (resultEnum.MoveNext()) 
    { 
     Customer c = (Customer)resultEnum.Current; 
     addToDataSet(Guid.NewGuid().ToString(), c); 
    } 
    ShowResult(); 
} 
else 
{ 
    MessageBox.Show("No Customer found within criteria"); 
} 

wyjątek to na tej linii

IEnumerator<Customer> resultEnum = result.GetEnumerator(); 
+0

co jest wartością w 'txtSerchId.Text' i jaki jest oczekiwany wynik? Porównywasz 'IDklienta' do dowolnego ciągu ???? – Bazzz

+0

txtSerchId to TextFeild (WindowForm Contorl) Porównuję wprowadzoną przez użytkownika wartość do kolekcji obiektów, które posiadam, aby wyszukać Klienci, którzy mają identyfikatory mniejsze niż lub można powiedzieć większe niż te wprowadzone przez użytkownika. – MBasit

+0

i to jest "Tekst"? Jaki sens ma porównanie tego tekstu do "ID klienta"? Może po prostu nie rozumiem twoich wymagań biznesowych. – Bazzz

Odpowiedz

5

spróbuj tego:

var query = from c in customers where c.CustomerID.Equals(txtSerchId.Text) select c; 
+1

Zasugeruję String.Equals (objA, objB) zamiast objA.Equals (objB). – Tilak

+0

yah! Miałem tylko wspomnieć, że kiedy używam metody Equals (to nie jest wymagane tylko do sprawdzania), która działa świetnie, a to jest dla mnie bardziej frustrujące ........ – MBasit

0

Cytując z komentarzem „Jestem porównując użytkownika wprowadzoną wartość do zbierania przedmiotów mam, poszukiwania klientów posiadających identyfikatory mniejsze lub można powiedzieć większy niż ten wprowadzony przez użytkownika. "

spróbować tego typu "większy niż":

int customerId = int.Parse(txtSerchId.Text); 
if (customerId > 0) 
{ 
    var result = from c in customers where c.CustomerID > customerId select c; 
} 

Aktualizacja jako bardziej infomation został dodany w komentarzach:

Spróbuj tego:

customers.ToList().Where(c => c.CustomerID.CompareTo(txtSerchId.Text) >= 0); 

Zauważ, że jest to ogromnie i jest nieskuteczny, ponieważ najpierw wyciąga WSZYSTKIE rekordy z bazy danych, a THEN filtruje je według porównania ciągów. Ale szczerze mówiąc nie znam lepszego sposobu, więc warto spróbować.

+0

ID klienta nie będzie numeryczne zawsze, właściwie nigdy. ..... – MBasit

+0

Interesujące, to czy decydujesz, czy określony ID klienta jest większy niż inny? – Bazzz

+0

Dokładnie! większa na podstawie alfabetycznego porządku, to jest to, co metoda CompareTo ma po prostu Ale nie działa w konkursie LINQ Nie wiem Y ??? CompareTo Sposób klasy string jeden argument ciąg znaków i porównać je z „tym” (wywołanie) obiekt powraca następujące: 0 jeśli równe -1 jeżeli argument jest większa e..g („C” (”.CompareTo d ")) 1 jeśli argument jest mniejszy e..g (" c ".CompareTo (" a ")) – MBasit

0

Go prosta:

  1. o równość:

    var result = from c in customers where c.CustomerID ==Convert.ToInt32(txtSerchId.Text) select c;

  2. dla większej: where c.CustomerID >= Convert.ToInt32(txtSerchId.Text)

  3. Dla mniej: where c.CustomerID <= Convert.ToInt32(txtSerchId.Text)

0
var List = (from t in ObjCon.TableName 
          where t.GameDate.Value.CompareTo(GameDate) >= 0 
          join t1 in ObjCon.Teams on t.Home equals t1.TeamId 
          where t1.SportId == 3 

* To pracował dla mnie

Powiązane problemy