0
votes

Liste.where ("string" .Contains ()) renvoie null dans une requête LINQ

mon produit Classe: xxx

mon langue classe: xxx

et j'ai une méthode qui recherche dans des produits utilisant des propriétés "Nom" et renvoie Liste : xxx

Le problème est, une partie de Les champs "Français" ou "Italian" Les champs ne sont pas attribués à DB pourtant , donc ceux-ci sont null champs.

et programme donne une erreur " Référence d'objet non définie sur une instance d'un objet ".

donc j'ai ajouté un contrôle supplémentaire qui est: xxx

mais j'ai toujours le même < forte> erreur . Quelqu'un pourrait-il aider s'il vous plaît? Je me suis confus, je ne devrais-je pas passer les champs null

Note: Je sais que je devrais filtrer directement dans _context.products.where (i => i.nameenglish.contains (RecherchedData)). Tolist (); Mais c'est pour mes tests à des fins , j'essaie d'utiliser "où", dans un type "liste". xxx

Remarque: J'avais 12 rangées maintenant, j'ai ... (cela n'a pas changé le résultat, mais j'ai supprimé pour que vous puissiez voir ma table clairement)


21 commentaires

Pourquoi faites-vous var produits = _Contex.products.tolist () qui entraînera tirer toutes les lignes de la DB. Pourquoi ne pas déterminer quel à faire avant d'appeler tolist de sorte que le code soit traduit en SQL et effectué sur la base de données à la place?


Je sais que cela coûte cher, mais à des fins de test, je devrais retourner les valeurs comme celle-ci. Ceci est un projet de test, il y a donc de petites valeurs de valeur dans ma DB.


Et aussi, je veux utiliser "Où" où j'ai un type d'objet "Liste".


Il n'y a pas de différence entre vos deux "déclarations".


Sur quelle ligne de code l'exception survient-elle? En outre, veuillez coller le code exact que vous essayez car string.isnullorempty ne compilera pas, c'est string.isnullorempty Il est difficile de réduire les problèmes si vous essayez de transcrire où vous pensez que la question réside plutôt que de fournir le code exact.


@Sach La différence est i.nameAnglais vs i.nametalien .


Oh d'accord. Juste remarqué.


Je suis d'accord avec @stevepy. Cette exception peut résulter d'un couple de lignes différentes ici, nous devons donc savoir exactement celui qui l'entraîne


@Steve Py Produits de retour.Lès (i => i.nameenglish.contains (RecherchedData)). Toli St (); Cette ligne jette directement l'exception.


@Burak êtes-vous sûr que produits n'est pas null?


Oui je suis sûr..


Est-il possible que i est quelque peu null (par exemple l'un quelconque des éléments de produits est null)?


@Matt u débogué comme 100 fois et j'ai 12 produits dans ma table, je peux écrire mon résultat "Select" si vous voulez voir.


Vous avez inspecté la liste de produits dans le débogueur et ils sont tous renseignés?


Vous avez mentionné l'ajout d'une vérification si nomengleglish est null mais non si nomItalian est. Avez-vous réellement protégé contre soit NULL?


@Jacob il n'y a pas de cru où ils sont tous les deux null.


@Matt u oui monsieur, ils ont peuplé.


@Burak: Ce n'est pas mon point. Avez-vous réparez-vous les deux clauses?


@Jacob oh je vois, oui je l'ai fait monsieur.


Mind affichant votre code complet sur lequel vous ajoutez ces chèques, au cas où vous auriez commis une légère erreur là-bas? Une erreur potentielle, par exemple aurait pu vérifier si nomengleglish était null dans les deux clauses au lieu d'une vérification nomayenglish et l'autre Vérification nomanien . Ce doit être un problème dans la clause WHERE. Vous êtes également sûr que recherchéddata n'est-ce pas NULL?


Pouvez-vous s'il vous plaît modifier le titre du message pour avoir un sens - .where jamais retour null ...


5 Réponses :


0
votes

essayez i => i.nametalien! = null && i.nametalien.contains (RecherchedData) et également pour l'anglais.


4 commentaires

OP a dit qu'ils ont ajouté ce chèque.


Oui j'ai ajouté ce seul et string.isnullorempty contrôle


Je n'ai pas vu le ! = Null , seulement le string.isnullorempty () qui sont vraiment différent du point de vue du cadre d'entité.


Mais ce produit ne va pas à EF car ils optent un tolist avant d'appliquer le .



6
votes

Vous pouvez utiliser un opérateur conditionnel NULL si tous ces éléments sont effectivement non null. C'est plus propre qu'un chèque null, imo: xxx

de même pour nomitalien .


8 commentaires

Essayer immédiatement.


Si vous modifiez les deux et avez toujours un problème, autre chose se passe et cela ne peut pas être ces lignes.


D'accord Matt cela a fonctionné, mais quelle était la différence entre "! = Null, string.isnullorempty (str)" et celui-ci? Pouvez-vous s'il vous plaît expliquer?


Semble être un comportement moins connu de Linq: Stackoverflow.com/a/772283/12431728 ... Évaluation de court-circuit ne se produit pas comme on peut s'attendre.


@MATTU mais dans ce cas, il s'agit certainement d'utiliser Linq-to-Objects.


@juhararr Oui, j'ai remarqué que, mais cela semble être le même cas.


Une autre différence est si nomengleglish est vide et RecherchedData est vide, alors cela aboutira à true pendant que le isnullorempty devrait aboutir à faux .


null coalesce comme p =>. . . ) ?? FAUX == VRAI RÉALISERA QUE, mais je suis entré dans la pratique consistant à vérifier Verbose NULL en raison de toujours utiliser LINQ-TO-SQL et de devoir gérer ces limitations.



1
votes

Essayez ce qui suit: xxx pré>

Si cela soulève une erreur, veuillez fournir les détails exacts d'exception et toute exception interne. Ce qui précède devrait fonctionner et lorsqu'il est passé à EF2SQL, il devrait gérer le potentiel des noms d'être nuls. P>

Comme vous le mentionnez, vous souhaitez charger de la liste. Dans ce cas, vous auriez besoin d'affirmer la vérification nulle: p>

List<Product> GetProductsFromSearch(int languageId, string searchedData){
   if (string.IsNullOrEmpty(searchedData))
       return new List<Product>();

   var query = _contex.Products.ToList(); 

    switch(languageId) //LanguageId 1 = English , LangaugeId 2 = Italian
    {
       case 1:
            query = query.Where(i=> !string.IsNullOrEmpty(i.NameEnglish) && i.NameEnglish.Contains(searchedData));
       case 2:
            query = query.Where(i=> !string.IsNullOrEmpty(i.NameItalian) && i.NameItalian.Contains(searchedData));
    }

    return query.ToList();
}


0 commentaires

0
votes

Je recommanderais d'ajouter un enregistreur à votre contexte juste à des fins de débogage:

https://docs.microsoft.com / FR-US / EF / EF6 / Principes de base / Logging-et-Interception

Vous pouvez alors voir quelles requêtes exactes sont générées et quelle requête exacte provoque un problème. Parfois, la traduction de SQL ne fonctionne pas exactement comme si vous pensez.


1 commentaires

Merci, j'ajouterai.



0
votes

Ceci revient à un facteur simple. Vous devez comprendre le flux de votre logique d'affectation. Les NPES traitent toujours des asignensations variables dont plusieurs raisons peuvent être plusieurs raisons. Linq en tant que n'importe quel () qui peut être utilisé pour tester une condition sur un iEnumerable avant de devoir tirer ses résultats. Cela peut vous aider à utiliser un appareil approprié pour cette exception.


0 commentaires