Pregunta

Tengo una consulta que selecciona los datos en un tipo personalizado -

UserData curData = dc.Users.Where(λ => (λ.Login == username) && λ.Active) 
    .Select( λ => new UserData { ID = λ.ID, UserName = λ.Login, isAdmin = λ.Admin, isTrusted = λ.Trusted, EMail = λ.E_mail ... });
     //Yeah I know this isn't a technically correct usage of 'λ' 
     //It is just a convenient variable name. Please don't hit me. 

Cuando llego a la información de un usuario que me gustaría ser capaz de actualizar la información como 'lastIP' y 'LastVisit' a continuación, enviar los cambios si la contraseña es correcta y el registro de éxito.

Si he entendido bien el nuevo objeto es tan detatched- cambios en él no se guardarán si alterarlo y llaman dc.SubmitChanges (). Entonces, ¿cuál es la mejor manera de realizar una actualización en esta situación. ¿Es necesario que acaba de hacer otra seleccionar y modificar los datos allí, ¿hay alguna manera de inline en mi declaración inicial?

Gracias por la ayuda!


Pongo esto juntos, pensé que había puesto que en caso de que alguien más se necesita una solución en línea -

internal static class auth_extensions
{  

    public static IQueryable<User> Update(this IQueryable<User> data, Action<User> updateDelegate)
    {
        foreach (User cur in data)
        {
            updateDelegate(cur);
        }
        return data;

    }
}
    }

Con el método de extensión en el conjunto de la consulta se convierte en -

UserData curData = dc.Users
    .Where(λ => (λ.Login == username) && λ.Active)
    .Update(λ => {
         λ.LastIP = HttpContext.Current.Request.UserHostAddress; 
         λ.lastVisit = DateTime.Now; 
    })
    .Select(loadDelegate).SingleOrDefault();

Una vez dicho esto la sugerencia de cdonner es excelente.

¿Fue útil?

Solución

Sin más contexto, su intención no es clara. Que va a copiar los atributos de usuario de un objeto de usuario en un objeto UserData. ¿Por qué no acaba de editar un objeto de usuario? Entonces SubmitChanges () persistirán automáticamente sus actualizaciones. es decir.

User curData = dc.Users.Where(λ => (λ.Login == username) && λ.Active)

Otros consejos

Aquí está un ejemplo simple:

    using(DbContext dbContext = new DbContext())
    {
        UserData curData = dc.Users.Where(λ => (λ.Login == username) && λ.Active).SingleOrDefault(); // You need(!) to use SingleOrDefault or FirstOrDefault
        if(curData != null) 
        {
            curData.LastIP = 'xx.xx.xx.xx';
            curData.LastVisit = DateTime.Now;
            dbContext.SaveChanges();
        }
    }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top