5

Estoy atrapado en algún lugar de mi aplicación ASP.NET MVC 3. Aquí está el error que estoy recibiendo:Solo se admiten inicializadores, miembros de entidades y propiedades de navegación de entidades. (ASP.NET MVC y Entity Framework)

El miembro tipo especificado 'AccommPropertyTags' no se admite en LINQ a Entidades. Solo se admiten las propiedades de navegación de inicializadores, miembros de entidad y entidad .

he encontrado cómo podemos resolver esto en el artículo siguiente:

Only initializers, entity members, and entity navigation properties are supported

Pero la mía es un poco extraño.

Aquí es uno de la clase parcial de mi entidad:

[MetadataType(typeof(AccommPropertyWebDetail.MetaData))] 
public partial class AccommPropertyWebDetail { 

    public virtual ICollection<string> AccommPropertyTags { 

     get { 

      return Helpers.AccommPropertyTag.CreateStringListFromString(this.PropertyTags); 
     } 
    } 

    private class MetaData { 

     [Required, StringLength(50)] 
     public string Category { get; set; } 

    } 
} 

Como se puede ver arriba, AccommPropertyTags propiedad es typeof ICollection<string>. Lo que trato en mi controlador es el siguiente:

public ViewResult Tag(string tag) { 

    var _rawTag = HttpUtility.UrlDecode(tag); 

    ViewBag.Tag = _rawTag; 

    var model = _accommpropertyrepo.GetAllAccommPropertiesFullWebIgnoringApprovalStatus(); 

    model = model.Where(
      x => x.AccommPropertyTags.Any(
        y => y == _rawTag 
       ) 
     ); 

    return View(model); 
} 

Debido al hecho de que estoy usando Any allí, Entidad está tratando de convertir mi propiedad AccommPropertyTags a SQL y no puede porque no es parte del esquema de la tabla.

¿Realmente estoy atrapado aquí o hay una forma genial de superar este molesto error?

Respuesta

10

Tu problema es similar a la pregunta que has vinculado. Llame al model.ToList() antes de usar Where. Esto obligará a EF a materializar entidades y luego aplicará el resto del filtrado en la memoria.

public ViewResult Tag(string tag) { 

    var _rawTag = HttpUtility.UrlDecode(tag); 

    ViewBag.Tag = _rawTag; 

    var model = _accommpropertyrepo.GetAllAccommPropertiesFullWebIgnoringApprovalStatus(); 

    var result = model.ToList().Where(
      x => x.AccommPropertyTags.Any(
        y => y == _rawTag 
       ) 
     ); 

    return View(result); 
} 
Cuestiones relacionadas