Impossible de comparer des éléments de type ‘System.Collections.Generic.ICollection`1 Seuls les types primitifs, les types énumération et les types entité sont pris en charge.

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,