9
votes

Query Linq où Int ID appartient à la liste

J'ai un problème avec une requête LINQ. Je l'ai utilisé de la même manière que je ne peux pas comprendre ce qui pourrait être faux maintenant.

Erreurs

La meilleure correspondance de la méthode surchargée pour 'System.Collections.Generic.List.Contains (int)' a des arguments invalides
Argument '1': impossible de convertir de 'int?' à 'int'; se réfère à la clause de RTestrésults

code: xxx

aucune idée de ce qui se passe?

Toute aide appréciée,
Merci


0 commentaires

3 Réponses :


6
votes

C'est parce que le champ ID est nullable, tandis que les éléments de la collection ne sont pas.

Vous avez probablement oublié de le marquer comme non-null dans la base de données, donc le concepteur, le généré de cette façon. P> Meilleur chose à chose dans la DB est non-NULL et rafraîchissez les données. P>

En plus, vous n'avez pas spécifié qui LINQ Vous utilisez, en vous supposant que LINQ The DB, je ne suis pas sûr que la méthode d'extension contient fonctionne dans Linq à SQL ou Linq aux entités, vous pourriez obtenir Une autre notaupportedexception même après que vous fixiez ce qui précède. p>

Par conséquent, utilisez deux requêtes, le premier à accéder à la DB et à la seconde pour extraire votre valeur de la collection chargée ou envisagez d'utiliser " Contient () "Solution de contournement utilisant Linq vers des entités? . P>

et si vous Utilisez des objets Linq-à des objets et vous ne vous souciez pas de toute la corbeille indiquée ci-dessus, utilisez simplement le fo LLOWING: P>

var rTestResults = from rT in mDataContext.TestSamplesViews  
                   where rT.PlateID.HasValue &&
                       rMTCPlates.Contains(rT.PlateID.Value)  
                   select rT.Value; 


0 commentaires

21
votes

Vous pouvez utiliser le opérateur null-coalescent ici:

var rTestResults = from rT in mDataContext.TestSamplesViews 
               where rMTCPlates.Contains(rT.PlateID ?? 0) 
               select rT; 


1 commentaires

Vous pouvez également utiliser RT.PLATED.GETVALUEDEFAULT (), qui utilisera toute la valeur par défaut pour votre type s'il est null.



2
votes

Depuis l'exception dans ON SYSTEM.Collections.Generic.List.Contains (int) Code> Je peux deviner que le mdataContext.teStsamplesviewss.Le plaqueide code> est nullable.

Si vous voulez juste un correctif EasyQuick, et / ou vous ne pouvez pas changer plaqueid code> de sorte qu'il n'est plus nullable, vous pouvez vérifier s'il a une valeur d'abord: p>

var rTestResults = from rT in mDataContext.TestSamplesViews
                   where (rT.PlateID.HasValue && rMTCPlates.Contains(rT.PlateID))
                   select rT;  


0 commentaires