c# - tipos - no se puede convertir un objeto de tipo wherelistiterator
No se pueden comparar elementos de tipo ''System.Collections.Generic.ICollection`1 Solo se admiten tipos primitivos, tipos de enumeraciĆ³n y tipos de entidades (5)
El campo de colección puede ser nulo en este caso, se obtiene la excepción NullReferenceException
cuando use RelatedTables.Any()
Si agrega RelatedTables != null
como en una pregunta, puede obtener
No se pueden comparar elementos del tipo ''System.Collections.Generic.ICollection`1 [[Project1, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null]]''. Sólo se admiten tipos primitivos, tipos de enumeración y tipos de entidad.
Si obtiene la excepción NullReferenceException
, la carga diferida no se desactiva y está bien con la carga diferida para el campo, para evitar el campo de marca de excepción con virtual
palabra clave virtual
para permitir la carga diferida para el campo
virtual ICollection<Table> RelatedTables{ get; set; }
He escrito este codigo
IQueryable<Site> sites = context.MainTable.Include("RelatedTable");
if (!string.IsNullOrEmpty(param1)) {
sites = sites.Where(s => s.RelatedTable != null && s.RelatedTable.Any(p => p.Name == param1.ToLower() && p.PolicyType == "primary"));
}
foreach (string secondaryPolicy in secondaryPolicies)
{
sites = sites.Where(s => s.RelatedTable != null && s.RelatedTable.Any(p => p.Name == secondaryPolicy.ToLower() && p.PolicyType == "secondary"));
}
return sites.ToList();
Sin embargo, en la línea ToList
estoy recibiendo la excepción
No se pueden comparar elementos del tipo ''System.Collections.Generic.ICollection`1 [[Project1, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null]]''. Sólo se admiten tipos primitivos, tipos de enumeración y tipos de entidad.
El error puede ocurrir si la colección de navegación se compara con null. Debe comprobarse si existe algún registro. En el ejemplo particular, Any se usa de todos modos, por lo tanto, verificar que la recopilación sea nula es redundante
Incorrecto
dbContext.MainTable.Where(c => c.RelatedTable==null )
Correcto
dbContext.MainTable.Where(c => !c.RelatedTable.Any() )
Es porque tienes un cheque nulo en la cláusula where.
Me funciona, acabo de quitar el cheque nulo;
correcto: resultado =
db.EmpTable.FirstOrDefault().ProjectsAssign.Name,
InCorrect: resultado =
db.EmpTable!=null && db.EmpTable.FirstOrDefault().ProjectsAssign!=null ?
db.EmpTable.FirstOrDefault().ProjectsAssign.Name : null,
No se puede comparar una tabla relacionada con null
directamente. En su lugar, compare con su miembro de clave externa (suponiendo que la PrimaryTable
RelatedTable
PrimaryTable
referencia a la RelatedTable
utilizando un miembro llamado RelatedTableId
.
sites.Where(s => s.RelatedTableId != null && s.RelatedTable.Any(
p => p.Name == param1.ToLower() && p.PolicyType == "primary"));
Incluso puede salirse con la eliminación de la comprobación nula por completo. Dado que esta consulta se ejecuta en la base de datos, no obtendrá una NullReferenceException
y puede funcionar. Sin embargo, tendrás que verificar eso.