2010-02-04 7 views
2

J'apprends juste Linq et ai rencontré un problème. Pour une validation, je reçois le dernier odomètre de notre base de données et je dois le comparer à la lecture suivante. La lecture de l'odomètre est un int sur les données entrantes et double sur la base de données (changé en int sur le fichier dbml).Confused sur Obtenir un int sur un var de Linq2Sql

Ci-dessous mon code:

private bool IsValidOdometer(string equipment, int odometerReading) 
{ 
    bool returnVariable = true; 
    CarteGraphDataDataContext db = new CarteGraphDataDataContext(); 

    var odometer = (from p in db.EquipmentMainGenerals join q in db.EquipmentFuelLogs 
      on p.wdEquipmentMainGeneralOID equals q.wdEquipmentMainGeneralOID 
      where p.VehicleId == equipment 
      orderby q.Odometer descending 
      select q.Odometer).Take(1); 

    int previousOdometer = odometer; 

    if (odometer.Count() != 0) 
    { 
     if (odometerReading < previousOdometer) 
     { 
      returnVariable = false; 
     } 
    } 

    return returnVariable; 
} 

La ligne de problème est int previousOdometer = odometer;. L'erreur que je reçois est:

Impossible de convertir implicitement le type 'System.Linq.IQueryable' à 'int'

Comment puis-je résoudre ce problème?

Répondre

4

Au lieu de Enumerable.Take, utilisez Enumerable.Single. Enumerable.Take retourne un IEnumerable mais Enumerable.Single retournera une seule instance (ou jeter):

int odometer = (from p in db.EquipmentMainGenerals 
       join q in db.EquipmentFuelLogs 
       on p.wdEquipmentMainGeneralOID 
        equals q.wdEquipmentMainGeneralOID 
       where p.VehicleId == equipment 
       orderby q.Odometer descending 
       select q.Odometer).Single(); 

int previousOdometer = odometer; 

En outre, je typer explicitement odometer ici au lieu de implicitement que vous avez fait.

Enfin votre ligne

CarteGraphDataDataContext db = new CarteGraphDataDataContext();

devrait vraiment être dans using bloc comme si

using(CarteGraphDataDataContext db = new CarteGraphDataDataContext()) { 
    // okay to go 
} 
+0

Merci. La seule chose à ajouter est que je devais le lancer en int. –

+0

@Mike Wills: Ah, quel est le type dans la base de données et quel est le type de 'EquipmentFuelLogs.Odometer'? – jason

+0

Je pense qu'il veut probablement utiliser First() au lieu de Single() puisque Single garantit qu'il n'y avait qu'un seul élément dans IEnumerable. Dans ce cas, il veut le plus nouveau – Mike

Questions connexes