Pregunta

Tengo un modelo en la parte superior de mi modelo de base de datos y el mapa los objetos en mi repositorio.

Sin embargo, al parecer, se hace una diferencia si yo "SELECT nueva" directamente en mis GetUsers o "SELECT factoryresult" tal como se aplica a continuación. Me sale el error en tiempo de ejecución, que el CreateFromDbModel método no tiene una traducción a SQL (System.NotSupportedException).

¿Hay una manera de evitar esto? ¿Puedo reparar de alguna manera?

La razón para querer utilizar el método de fábrica es que pueda instanciar objetos en otro lugar y quiere mantener el 'código de correspondencia' en un solo lugar ...

Gracias por cualquier comentario, Anders

    public IQueryable<User> GetUsers(bool includeTeams)
    {
        return from u in _db.sc_Players
               where (includeTeams || (!u.aspnet_User.sc_Player.IsTeam))
               select UserFactory2.CreateFromDbModel(u);
    }


    public static User CreateFromDbModel(sc_Player player)
    {
        return new User
                   {
                       Id = player.sc_PlayerID,
                       FirstName = player.FirstName.Trim(),
                       LastName = player.LastName.Trim(),
                       PresentationName = player.FirstName.Trim() + " " + player.LastName.Trim(),
                       LoginName = player.aspnet_User.LoweredUserName,
                       IsTeam = player.IsTeam,
                       Email = player.aspnet_User.aspnet_Membership.Email,
                       Password = player.aspnet_User.aspnet_Membership.Password
                   };
    }
¿Fue útil?

Solución

¿El problema es becuase va a devolver IQueryable en su método GetUsers? Trate de regresar Lista lugar. Esto obligará a la consulta LINQ para ejecutar dentro del método.

public List<User> GetUsers(bool includeTeams)
{
    return (from u in _db.sc_Players
    where (includeTeams || (!u.aspnet_User.sc_Player.IsTeam))
    select UserFactory2.CreateFromDbModel(u)).ToList();
}

No estoy seguro si esto va a solucionar el problema, sólo una corazonada. Yo era capaz de duplicar lo que está haciendo en LINQPad en una base de datos local, y funcionó. Pero mi muestra no regresaba IQueryable. ¿Está modifing furthur la colección IQueryable fuera del GetUsers ()?

Editar

He hecho un poco más de cheques. Yo era capaz de duplicar el error sólo cuando lo modifico mi muestra por lo que la colección IQueryable se utilizó en una segunda consulta LINQ después de llamar GetUsers ():

IQueryable<User> query = GetUsers(true);

var q = from u in query
    where u.Name.Contains("Bob")
    select new {Name = u.FirstName + " " + u.LastName};

apuesto si va a devolver una lista como se sugirió anteriormente en GetUsers () el error desaparecerá. El único inconveniente es que ningún tipo de filtrado que haces después de llamar GetUsers () no limitará la cantidad de datos devueltos por la base de datos porque ya se ha ejecutado la consulta al llamar .ToList ().

Editar 2:

Por desgracia, no creo que haya ninguna otra manera de incluir su método de fábrica en la consulta. Tengo una idea más. Puede crear un método de extensión para IQueryable, lo llaman algo así como ToUserList (). Dentro ToUserList () se llama a ToList () en la consulta y su método de fábrica que devuelve un conjunto de usuarios. Llamar a este método cuando haya terminado el filtrado de los datos utilizando LINQ. Esto le permitirá únicamente para ejecutar la consulta cuando esté listo para cargar los datos de la base de datos. Un ejemplo es la siguiente.

public static List<Users> ToUserList(this IQueryable<User> query)
{
     return query.ToList().Select(u => UserFactory2.CreateFromDbModel(u)); 
}

Llama al método de extensión de esta manera:

// Filter the data using linq. When you are ready to execute the query call:
query.ToUserList(); // Query will execute and a list of User objects returned.

Espero que esto tiene sentido. Douglas H.

Otros consejos

El error explica casi todo.

"método CreateFromDbModel no tiene traducción a SQL (System.NotSupportedException)"

Su método CreateFromDbModel no es una función de SQL. Su aplicación no será capaz de ejecutar la función CreateFromDbModel hasta que los objetos se devuelven específicamente para usted desde el servidor. Es muy probable que tenga que llamar a un ToList () o algo similar en su consulta antes de poder ejecutar CreateFromDbModel en ellos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top