2012-05-04 16 views
5

CompareTo no funciona aquí para mí.Cómo comparar cadenas en la consulta de Linq

Mi consulta LINQ es

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

y em conseguir una excepción

////// EXCEPCIÓN ///////////

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

Mi código es algo como esto

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"); 
} 

excepción es en esta línea

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

cuál es el valor en 'txtSerchId.Text' y cuál es el resultado esperado? ¿Estás comparando 'CustomerID' con una cadena arbitraria ???? – Bazzz

+0

txtSerchId es TextFeild (WindowForm Contorl) estoy comparando el valor ingresado por el usuario con la colección de objetos que tengo, para buscar Clientes que tengan IDs menores o mayor que el ingresado por el usuario. – MBasit

+0

y es 'Text' es? ¿Y qué sentido tiene comparar este texto con un 'CustomerID'? Tal vez no entiendo los requisitos de su negocio. – Bazzz

Respuesta

5

intente esto:

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

Sugeriré String.Equals (objA, objB) en lugar de objA.Equals (objB). – Tilak

+0

yah! Solo mencioné que cuando uso el método Equals (que no es requisito solo para verificar) funciona muy bien, y esto es más frustrante para mí ........ – MBasit

0

Citando de su comentario "Estoy comparando el valor introducido por el usuario a la colección de objetos que tengo, para buscar clientes que tienen identificadores de menos de o se puede decir mayor que el ingresado por el usuario ".

probar esto de "mayor que":

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

datos a más infomación se ha añadido en los comentarios:

Prueba esto:

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

Tenga en cuenta que esto es inmensamente i Nefficient ya que primero saca TODOS los registros de la base de datos y ENTONCES los filtra según su comparación de cadenas. Pero para ser sincero, no conozco una mejor manera, así que podría valer la pena intentarlo.

+0

CustomerID no será siempre numérico, en realidad nunca. ..... – MBasit

+0

Interesante, ¿entonces usted decide si un cierto CustomerID es mayor que otro? – Bazzz

+0

¡Exactamente! mayor en base al orden alfabético, esto es lo que hace el método CompareTo simplemente Pero no está funcionando en el concurso LINQ ¿No sabe Y ??? Método CompareTo de clase de cadena toma un argumento de cadena y lo compara con 'este' (llamada) objeto devuelve como sigue: 0 si es igual -1 si el argumento es mayor e..g ("c" .CompareTo (" d ")) 1 si el argumento es menos e..g (" c ".CompareTo (" a ")) – MBasit

0

Ir sencilla:

  1. de la igualdad:

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

  2. Por Mayor: where c.CustomerID >= Convert.ToInt32(txtSerchId.Text)

  3. Por menos: 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 

* Esto funcionó para mí