Question LINQ lançant une exception de conversion non valide sur un bigint


J'ai une requête LINQ qui ressemble à ceci:

var clintLst = (from clntDt in ent.ClientDatas
                where clntDt.CompanyName.Substring(0,searchWord.Length).Equals(searchWord, StringComparison.CurrentCultureIgnoreCase)
                orderby clntDt.CompanyName
                select new { ClientDataID = clntDt.ClientDataID,
                    CompanyName = clntDt.CompanyName, 
                    ContactName = (clntDt.ContactFirstName + " " + clntDt.ContactLastName),
                    CompanyLocation = clntDt.Location.LocationCity.CityName + ", " + clntDt.Location.LocationState.StateCode
                } ).Distinct().Take(10);

Cependant, il lance l'exception suivante:

La distribution spécifiée à partir d'un matérialisé   'System.Int32' tapez le type   Le type 'System.Int64' n'est pas valide. [..]   Détails des exceptions:   System.InvalidOperationException: le   moulage spécifié à partir d'un matérialisé   'System.Int32' tapez le type   Le type 'System.Int64' n'est pas valide.

Fichier source:   C: \ TempPersonalCode \ TransportTracking \ TransportTracking \ TransportTracking \ Controllers \ AJAXController.cs   Ligne: 35

(La ligne 35 est la clause select)

Je suis confus parce que si changer:

select new { ClientDataID = clntDt.ClientDataID,
    CompanyName = clntDt.CompanyName, 

à

select new { ClientDataID = (Int32)clntDt.ClientDataID,
    CompanyName = clntDt.CompanyName, 

alors ça marche bien. Un objet anonyme n'est-il pas censé utiliser la réflexion pour déterminer son type? Si oui, pourquoi décide-t-il que c'est un "Int32" au lieu d'un long? Dans l'EDMX, je l'ai comme Int64.


11
2018-04-29 01:27


origine


Réponses:


L'expression "valeur matérialisée" fait référence à la valeur extraite du magasin de données.

Ce qui se passe probablement est que la base de données a cette colonne configurée comme un int, mais dans votre fichier EDMX c'est un long (ou Int64).

le (Int32) vous êtes mis sur le front est (probablement) être traduit dans le magasin de données (dans SQL Server, cela signifie quelque chose comme CAST([columnName] AS int), et par conséquent, Entity Framework est maintenant attendant pour obtenir un int au lieu d'un long.

Sans le casting, il attend un long mais obtenir un int.

La solution consiste à modifier le fichier EDMX ou à modifier la colonne afin que le type de données dans le fichier EDMX corresponde au type de données de la base de données.

(jhott)


18
2018-03-18 03:07



Dans ma procédure stockée, je revenais row number et rowcount, Je l'ai jeté à int et cela fonctionne correctement maintenant.

CAST (TotalCount AS INT)TotalCount

1
2018-02-03 07:55



L'exception semble provenir de l'entité Framework. Vous pourriez avoir la colonne définie comme int au lieu de bigint dans le fichier SSDL.


0
2018-04-29 01:40