J’ai écrit ce code
IQueryable sites = context.MainTable.Include("RelatedTable"); if (!ssortingng.IsNullOrEmpty(param1)) { sites = sites.Where(s => s.RelatedTable != null && s.RelatedTable.Any(p => p.Name == param1.ToLower() && p.PolicyType == "primary")); } foreach (ssortingng secondaryPolicy in secondaryPolicies) { sites = sites.Where(s => s.RelatedTable != null && s.RelatedTable.Any(p => p.Name == secondaryPolicy.ToLower() && p.PolicyType == "secondary")); } return sites.ToList();
Cependant à la ligne ToList
je reçois l’exception
Impossible de comparer les éléments de type ‘System.Collections.Generic.ICollection`1 [[Project1, Version = 1.0.0.0, Culture = neutre, PublicKeyToken = null]]’. Seuls les types primitifs, les types d’énumération et les types d’entité sont pris en charge.
Vous ne pouvez pas comparer directement une table liée à null
. Au lieu de cela, comparez avec votre membre de clé étrangère (en supposant que PrimaryTable
référence à RelatedTable
utilisant un membre appelé RelatedTableId
.
sites.Where(s => s.RelatedTableId != null && s.RelatedTable.Any( p => p.Name == param1.ToLower() && p.PolicyType == "primary"));
Vous pourrez peut-être même vous en tirer en supprimant complètement le chèque nul. Puisque cette requête est exécutée sur la firebase database, vous n’obtiendrez pas d’ NullReferenceException
et cela pourrait fonctionner. Vous devrez cependant vérifier cela.
C’est parce que vous avez un contrôle nul dans la clause where.
L’erreur peut se produire si la collection de navigation est comparée à null. Il convient de vérifier si tout enregistrement existe. Dans l’exemple particulier, Any est utilisé de toute façon, donc vérifier que la collection est nulle est redondante
Incorrect
dbContext.MainTable.Where(c => c.RelatedTable==null )
Correct
dbContext.MainTable.Where(c => !c.RelatedTable.Any() )
Le champ de collection peut être nul dans ce cas, vous obtenez une exception NullReferenceException
lorsque vous utilisez RelatedTables.Any()
Si vous ajoutez RelatedTables != null
comme dans une question, vous pouvez obtenir
Impossible de comparer les éléments de type ‘System.Collections.Generic.ICollection`1 [[Project1, Version = 1.0.0.0, Culture = neutre, PublicKeyToken = null]]’. Seuls les types primitifs, les types d’énumération et les types d’entité sont pris en charge.
Si vous obtenez l’exception NullReferenceException
, le chargement différé n’est pas désactivé et vous pouvez utiliser le chargement différé pour le champ, puis empêcher le champ de marque d’exception avec virtual
mot clé virtual
pour permettre le chargement différé du champ.
virtual ICollection RelatedTables{ get; set; }
Cela fonctionne moi, je supprime juste le chèque nul;
correct: résultat =
db.EmpTable.FirstOrDefault().ProjectsAssign.Name,