2011-06-10 17 views
7

Mam 3 pola: urlName, displayName i active. To jest sprawdzanie rekordu edycji. Co chcę tutaj zrobić, to sprawdzić, czy UrlName jest unikalny w Db, ale w tym samym czasie, jeśli użytkownik zapisał już adres URL, ale zmieniono DisplayName i Active, wówczas rekord powinien zostać zaktualizowany.Problem z zapytaniem LINQ. Konieczność sprawdzenia, czy istnieje

Ktoś mi powie, jak to rozwiązać.

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(); 
     } 

aktualizując rekord jak

TryUpdateModel(existingMenu); 
       _menu.Add(); 

To jest to, co chcę osiągnąć

Moje inne 2 wartości powinny być dodane w Query DisplayName i aktywny. Załóżmy, że "UrlName" kontaktu już w DB. Ładuję wartości z dropdownu zwracającego UrlName = "About", DisplayName = "About Us", Active = true. Teraz edytuję rekord. Oto warunek do dopasowania.

1 - UrlName = "About", DisplayName = "O teście", Active = true -> To powinno się zaktualizować.

2 - UrlName = "Informacje", DisplayName = "O nas", Active = false -> To powinno zostać zaktualizowane.

3 - UrlName = "Informacje", DisplayName = "Informacje o teście", Aktywne = false -> To powinno zostać zaktualizowane.

Ważne: 4 - UrlName = "newnotexist", DisplayName = "O teście", Active = false ->Powinno to zaktualizować nazwę UrlName i pozostawić odpoczynek po zmianie.

5 - UrlName = "Kontakt", DisplayName = "Informacje o teście", Aktywny = fałsz ->Nie powinien aktualizować i generować błędu.

Mam nadzieję, że rozumiesz, co chcę zrobić.

+2

'(p.DisplayName! = Displayname || p.DisplayName == displayName)' i '(p.Active! = Aktywny || p.Active == aktywne)' zawsze będzie prawdą. Również nie jest jasne, co próbujesz osiągnąć. Czy możesz zmienić sformułowanie? –

+1

@Bala R, dzięki za odpowiedź. To jest dla formularza edycji. Nazwa UrlName jest unikalna w DB, ale DisplayName i Active nie są. Mam formularz z tymi 3 polami. Załadujesz 3 pola z listy rozwijanej. Teraz chce edytować DisplayName i Active z tą samą nazwą UrlName, niż powinna zaktualizować. W innym scenariuszu chce zmienić adres URL inny niż to, co jest ładowane (może zmienić inne wartości), ale nie może być unikalny i spróbować go zapisać, co powinno dać błąd. Czy teraz mam jasne? – Pirzada

Odpowiedz

23

Na podstawie zaktualizowanego pytania i jeśli dobrze je rozumiem, myślę, że to rozwiązanie będzie dla Ciebie skuteczne.

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

To jest najprostsza i doskonała odpowiedź. Dziękuję wszystkim za pomoc. – 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 = (z p w _db.SubMenus gdzie p.UrlName = urlName wybierz 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 
     } 
    } 
} 

Nadzieja to pomaga !!

+1

@aligray - Jeśli nazwa url jest unikatowa w DB (poprzez Unikalne ograniczenie indeksu), twoja inna (inaczej 'if (count> 1)') nigdy nie wystąpi. Możesz zmienić swoje zapytanie na '.Any()', które zwróci wartość true lub false, jeśli rekord istnieje. Zamiast zwracać liczbę. Następnie możesz po prostu napisać 'if (exists) {} else {}' – Phill

+0

@aligray, Sorry, twoje podejście jest nieprawidłowe.Napisałem, że jest to formularz do edycji. Nazwa UrlName jest unikalna w DB, ale DisplayName i Active nie są. Mam formularz z tymi 3 polami. Załadujesz 3 pola z listy rozwijanej. Teraz chce edytować DisplayName i Active z tą samą nazwą UrlName, niż powinna zaktualizować. W innym scenariuszu chce zmienić adres URL inny niż to, co jest ładowane (może zmienić inne wartości), ale nie może być unikalny i spróbować go zapisać, co powinno dać błąd. – Pirzada

+0

@ Hill, pozwól mi spróbować, że – Pirzada

Powiązane problemy