Requête LINQ Question, la Séquence contient pas d'éléments
Je suis en train de mettre à jour un enregistrement dans une table, mais quand je lance .Firstordefault()
, j'obtiens l'erreur: "la référence d'Objet n'est pas définie à une instance d'un objet.", et si l'utiliser avec .First()
, j'obtiens un "Séquence contient pas d'éléments".
Utiliser un autre endroit, sa fonctionne bien, mais cette fois à l'origine des erreurs.
Voici le code:
public class AllownceDetails
{
public int ta_id{get;set;}
public int tvrid{get;set;}
public DateTime ofDate{get;set;}
public string status{get;set;}
public string userid {get;set;}
}
//Update Method
public void Update(AllownceDetails Allowncedtl)
{
var ta = (from a in ce.tbl_tvrallownce
where a.tvrid == Allowncedtl.tvrid
//error: Sequence contains no elements
select a).SingleOrDefault();
ta.status = Allowncedtl.status;
//error:Object reference not set to an instance of an object
ce.SaveChanges();
}
parce qu'il est de retour null, c'est pourquoi la Première() est de donner de l'erreur et SingleOrDefault renvoie la valeur null si il n'y a pas d'enregistrement dans ce cas, vous obtiendrez de l'Objet de référence non définie dans l'instruction suivante. Donc, assurez-vous que vous avez obtenu quelques lignes en db contre Allowncedt1.tvrid
Cette erreur est vous dire il n'y a pas d'enregistrement qui correspond aux critères ".tvrid == Allowncedtl.tvrid".
Double Possible de Séquence contient pas d'éléments?
Cette erreur est vous dire il n'y a pas d'enregistrement qui correspond aux critères ".tvrid == Allowncedtl.tvrid".
Double Possible de Séquence contient pas d'éléments?
OriginalL'auteur Naveed | 2012-03-28
Vous devez vous connecter pour publier un commentaire.
La requête ne doit pas être le retour des données. Exécuter un profiler sur la base de données SQL pour voir le physique de la requête en cours d'exécution et d'essayer de l'exécuter manuellement sur la base de données pour voir ce que l'apparence des données. Vous devrez probablement ajuster la requête (ou les données) pour obtenir les résultats que vous recherchez.
"Séquence contient pas d'éléments" est fondamentalement LINQ façon de vous dire que vous êtes en train de faire référence à un élément à partir d'une liste qui n'a pas de quoi. Ainsi, les appels à des choses comme
.First()
ou.Single()
ne pouvez pas trouver quoi que ce soit, d'où l'erreur.Lorsque vous modifiez les appels à quelque chose comme
.FirstOrDefault()
ou.SingleOrDefault()
puis il ira avec la valeur "par défaut" de ce type, et pour les types référence la valeur par défaut estnull
. Donc, si vous réglez une chose ànull
et puis essayer d'appeler une méthode sur elle, vous obtiendrezobject reference not set to an instance of an object
.Ce qui continue à être le problème? La requête ne retourne aucun résultat?
OriginalL'auteur David
La Unique méthode renvoie cette erreur quand il n'y a pas d'éléments dans la liste(requête) ou il y a plusieurs éléments.
La SingleOrDefault méthode lève une exception lorsqu'il y a plusieurs éléments dans la liste. Retourne null quand il n'existe pas d'éléments.
La FirstOrDefault méthode renvoie le premier élément de la liste ou null. Il n'y a pas d'exceptions.
L'utilisation et la vérification de la référence null
La source sera toujours un objet, donc pas de soucis à ce sujet dans votre cas.
Vous n'avez pas d'enregistrements pour ce critère.
OriginalL'auteur Adrian Iftode
Tout cela signifie, c'est que votre requête n'est pas de correspondance quoi que ce soit. Sans doute
Allowncedtl.tvrid
est un code qui ne correspond à rien dans la base de données. Vous ne devrait pas supposer queSingleOrDefault
retourne une valeur non nulle. Utilisez uniquementSingleOrDefault
lorsque vous êtes attend qu'il y a peut-être pas de valeurs - et de faire face à cela. Si un échec à trouver une valeur indique un bogue, vous devez utiliserSingle
(ou peut-êtreFirst
) à la place.On ne peut pas dire quelque chose à propos de ce que le sous-jacent cause de votre erreur est - vous devez vous connecter dont le numéro que vous cherchez, le travail pourquoi que vous recherchez, puis vérifier dans la base de données.
OriginalL'auteur Jon Skeet