La dissortingbution spécifiée n’est pas valide. Requête Linq

Bonjour, j’aimerais interroger une table en fonction de sa clé primaire.

j’ai essayé les deux

var deviceDetails = (from d in db.Devices where d.DeviceId == pointDetails.DeviceId select d).ToList(); 

EDIT d.DeviceId

 var deviceDetails = db.Devices.Single(d => d.DeviceId == pointDetails.DeviceId) 

Je connais ces types de retour différents mais ce n’est pas le problème pour le moment.

Cette déclaration jette un invalidCastException et je ne sais pas pourquoi. PointDetails.DeviceId est certainement un int valide. L’exception est levée même si je remplace ceci par un int codé en dur.

voici les parties pertinentes de la trace de la stack.

  at System.Data.SqlClient.SqlBuffer.get_Int32() at System.Data.SqlClient.SqlDataReader.GetInt32(Int32 i) at Read_Device(ObjectMaterializer`1 ) at System.Data.Linq.SqlClient.ObjectReaderComstackr.ObjectReader`2.MoveNext() at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source) 

Toute aide est appréciée car je suis à court d’idées.

Définition et schéma de classe Voici la définition de classe d’un périphérique

 [global::System.Data.Linq.Mapping.TableAtsortingbute(Name="dbo.Devices")] public partial class Device : INotifyPropertyChanging, INotifyPropertyChanged { private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(Ssortingng.Empty); private int _DeviceId; private int _DeviceTypeId; private ssortingng _DeviceName; private ssortingng _DeviceMACAddress; private ssortingng _DeviceIPAddress; private ssortingng _DeviceSubnetMask; private ssortingng _DeviceGatewayAddress; private int _ZoneId; private int _TelevisionTypeId; private int _DeviceStatusId; private byte _DeviceIsModified; private int _DeviceSetupBaudRate; private int _DeviceConfigId; private byte _DeviceSetupIsInputInternalPower; private int _DeviceBedSensorInput; private int _DeviceEnsuiteSensorInput; private int _DeviceRoomSensorInput; private ssortingng _DeviceSetupSsortingng1; private ssortingng _DeviceSetupSsortingng2; private ssortingng _DeviceSetupSsortingng3; private ssortingng _DeviceSetupSsortingng4; private byte _DeviceSetupIsWiegand; private int _DeviceSetupOptionId; private byte _DeviceSetupIsLightMomentary; private ssortingng _DeviceTestDateTime; private ssortingng _DeviceTestResults; 

Voici la conception SQL

Schéma de conception SQL

Edit Identified la colonne à l’origine du problème

J’ai sélectionné une ressource à la fois pour trouver celle qui a provoqué l’exception de dissortingbution et il s’agit de DeviceStatusId. Quelles sont les contraintes sur un type tinyInt en SQL? Toutes les suggestions pour faire ce casting correctement

Je ne pense pas que l’erreur soit nécessairement dans votre prédicat where , mais dans votre select (au moins indirectement). Il est probable qu’une colonne de la firebase database (pas nécessairement la colonne DeviceId ) soit d’un type différent de celui d’une propriété du code C # compilé. Cela pourrait être aussi simple qu’une colonne étant nullable (et contenant une valeur nulle quelque part) où la propriété du code n’est pas nullable.

Notez où l’exception se produit. Cette ligne suggère que c’est quand les résultats sont énumérés, pas quand la clause where est évaluée (l’appel à “ToList”):

 System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source) 

Et cette ligne suggère que c’est quand une instance est en cours de construction (ou plutôt quand un “object” est en train de “se matérialiser”):

 Read_Device(ObjectMaterializer`1 ) 

Comme le fait celui-ci (l’appel du constructeur):

 System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) 

Fondamentalement, au moins une colonne ne correspond pas au code et au moins un enregistrement qui tire parti de cette différence. Lorsque cela se produit, le constructeur de l’object en cours de construction lève une exception, car il ne permet pas de comprendre les données qu’il reçoit.