2011-06-10 11 views
7

Tengo 3 campos: urlName, displayName y active. Esto es verificar el registro de edición. Lo que quiero hacer aquí es marcar UrlName es único en Db, pero al mismo tiempo, si el usuario ya ha guardado la Url pero cambió DisplayName y Active, entonces el registro debería actualizarse.Problema de consulta LINQ. Necesito verificar si existe

Cualquiera me dice cómo resolver eso.

public bool NothingExceptUrlNameExists(string urlName, string displayName, bool active) 
     { 
      return (from p in _db.SubMenus 
        where p.UrlName == urlName && (p.DisplayName != displayName || p.DisplayName == displayName) && (p.Active != active || p.Active == active) 
        select p).Any(); 
     } 

de Actualización del Registro como

TryUpdateModel(existingMenu); 
       _menu.Add(); 

Esto es lo que quiero lograr

Mis otros 2 valores deben añadirse en Query DisplayName y activa. Supongamos que "Contacto" UrlName ya está en DB. Estoy cargando valores de la lista desplegable que muestra UrlName = "Acerca de", DisplayName = "Acerca de nosotros", Activo = verdadero. Ahora editando el registro. Aquí están las condiciones para que coincida.

1 - UrlName = "Acerca de", DisplayName = "Acerca de la prueba", Activo = verdadero -> Esto debería actualizarse.

2 - UrlName = "Acerca de", DisplayName = "Sobre nosotros", Activo = falso -> Esto debería actualizarse.

3 - UrlName = "Acerca de", DisplayName = "Acerca de la prueba", Activo = falso -> Esto debería actualizarse.

Importante: 4 - UrlName = "newnotexist", DisplayName = "Acerca de la prueba", Activo = falso ->Esto debería actualizar UrlName y descansar si se cambia.

5 - UrlName = "Contacto", DisplayName = "Acerca de la prueba", Activo = falso ->Esto no debería actualizarse y generar un error.

Espero que entiendas lo que quiero hacer.

+2

'(p.DisplayName! = || idioma p.DisplayName == idioma)' y '(p.Active! = || activa p.Active == activa)' siempre será cierto. Además, no está muy claro qué estás tratando de lograr. ¿Puedes reformular/elaborar? –

+1

@ Bala R, gracias por la respuesta. Esto es para Editar formulario. UrlName es único en DB pero DisplayName y Active no lo son. Tengo formulario con estos 3 campos. Cargará 3 campos desde la selección del menú desplegable. Ahora quiere editar DisplayName y Active con el mismo UrlName del que debería actualizar. En otro escenario, quiere cambiar urlname diferente de lo que es load (podría cambiar otros valores) pero no es único e intenta guardarlo, lo que debería dar error. ¿Ahora lo veo claro? – Pirzada

Respuesta

23

Basado en la pregunta actualizada, y si la entiendo correctamente, creo que esta solución funcionará para usted.

var urlNameExists = _sb.Any(x => x.UrlName == urlName && x.Id != currentEditId); 

if (urlNameExists) 
    throw Exception("A record with that UrlName already exists"); 

TryUpdateModel(existingMenu); 
_menu.Add(); 
+0

Esa es la respuesta más simple y perfecta. Gracias a todos por su ayuda. – Pirzada

4
bool alreadyInDb = (from p in _db.SubMenus where p.UrlName = urlName select p).Count() > 0; 

if (alreadyInDb) 
{ 
    bool shouldAddRecord = (from p in _db.SubMenus where p.DisplayName == displayName && p.Active == active select p).Count() == 0; 

    if (shouldAddRecord) 
    { 
     TryUpdateModel(existingMenu); 
     _menu.Add(); 
    } 
} 
+1

bool alreadyInDb = (desde p en _db.SubMenus donde p.UrlName = urlName selecciona p) .Any(); –

3
private void Update(string urlName, string display, bool active) 
{ 
    item = db_.SubMenus.SingleOrDefault(x => x.UrlName == urlName); 

    if (item == null) 
    { 
     // Save new item here 
    } 
    else 
    { 
     if (item.DisplayName == display && item.Active == active) 
     { 
      // Error, fields haven't changed and url already in db 
     } 
     else 
     { 
      // Save because fields have changed 
     } 
    } 
} 

Espero que esto ayude !!

+1

@aligray - Si UrlName es único en el DB (a través de la Restricción de Índice Único), entonces su else (aka else 'if (count> 1)') nunca ocurrirá. Puede cambiar su consulta para que sea '.Any()', que dará como resultado verdadero o falso en función de si el registro existe o no. En lugar de devolver un conteo. Luego puede escribir 'if (exists) {} else {}' – Phill

+0

@aligray, lo siento, su enfoque no es el correcto.Publiqué que esto es para el formulario de edición. UrlName es único en DB pero DisplayName y Active no lo son. Tengo formulario con estos 3 campos. Cargará 3 campos desde la selección del menú desplegable. Ahora quiere editar DisplayName y Active con el mismo UrlName del que debería actualizar. En otro escenario, quiere cambiar urlname diferente de lo que es load (podría cambiar otros valores) pero no es único e intenta guardarlo, lo que debería dar error. – Pirzada

+0

@Phill, permítanme intentarlo – Pirzada

Cuestiones relacionadas