2010-04-09 5 views
0

Tout en essayant d'interroger des données à l'aide Entity Framework Linq Je reçois l'exception suivante:Erreur de conversion d'entité C# Linq sur une valeur inexistante?

{"Conversion failed when converting the varchar value '3208,7' to data type int."} 

Ce qui est source de confusion est que cette valeur n'existe même pas dans la vue j'Interrogation de. Il existe cependant dans le tableau sur lequel la vue est basée. La requête que je cours est le suivant:

return context.vb_audit_department 
       .Where(x => x.department_id == department_id && x.version_id == version_id) 
       .GroupBy(x => new { x.action_date, x.change_type, x.user_ntid, x.label }) 
       .Select(x => new 
       { 
        action_date = x.Key.action_date, 
        change_type = x.Key.change_type, 
        user_ntid = x.Key.user_ntid, 
        label = x.Key.label, 
        count = x.Count(), 
        items = x 
       }) 
       .OrderByDescending(x => x.action_date) 
       .Skip(startRowIndex) 
       .Take(maximumRows) 
       .ToList(); 

quelqu'un peut-il expliquer pourquoi LINQ interroge la table sous-jacente au lieu de la vue réelle, et s'il y a un moyen de contourner ce comportement?

Répondre

0

avant que nous puissions vous répondre à la dernière question que nous devons plus connaître le contexte de la requête LINQ est en cours d'exécution (et si EF ou LinqToSql comment le mappage est défini)

1

LINQ to SQL/EF ne pas requête la table sous-jacente au lieu d'une vue. Il n'a aucune connaissance de cette information.

Cette erreur provient de SQL Server lui-même. Il semble que la vue peut être définie avec un CAST qui échoue pour certaines lignes. Il est tout à fait possible de définir une vue de cette façon, de sorte qu'elle échoue uniquement lorsque vous essayez d'y ajouter SELECT, et vous recevrez ce message d'erreur exact.

Pour démontrer:

CREATE TABLE Test 
(
    Value varchar(50) 
) 

INSERT Test (Value) VALUES ('1') 

CREATE VIEW TestView AS 
    SELECT CAST(Value AS int) AS Value 
    FROM Test 

SELECT * FROM TestView -- Succeeds 

INSERT Test (Value) VALUES ('Some String') 

SELECT * FROM TestView -- Will fail with your error message 

Alors, encore une fois, il y a une bonne chance que le problème est avec la vue elle-même si vous êtes sûr que cette mauvaise valeur n'est pas censé apparaître dans la vue du tout . Soit cela ou votre mappage EF est incorrect (c'est-à-dire que vous avez le mauvais type défini pour l'une des colonnes). Cela peut également provoquer cette erreur car EF va insérer un CAST.

Questions connexes