Przypisanie listy obiektów do listy interfejsów - usunięcie elementu

0

Witam!

W czasie pisania projektu napotkałem się na następujący problem. Otóż załóżmy że mamy interfejs **IOrderingItem **który przechowuje zmienną określającą kolejność elementów i ich ID, oraz dwie klasy dziedziczące: **Banner **i Page. Żeby nie duplikować tego samego kodu, napisałem funkcję która może jednocześnie usuwać obiekty obu tych klas.

///ItemType to enum mający dwa elementy: Page i Banner
public ActionResult DeleteItem(int id, Zaklad.Models.ItemType type)
{
    using (Zaklad.Models.DatabaseContext db = new Zaklad.Models.DatabaseContext())
    {
        //Articles i Banners to obiekty typu DbSet
        IEnumerable<Zaklad.Models.IOrderingItem> listOfItems = null;
        if (type == Zaklad.Models.ItemType.Banner)
            listOfItems = db.Banners;
        else if (type == Zaklad.Models.ItemType.Page)
            listOfItems = db.Articles;

        if (listOfItems.Any(p => p.ID == id))
        {
            ///???

            db.SaveChanges();
        }
    }
    return RedirectToAction(type.ToString() + "s");
}

W oznaczonym miejscu mam problem. Otóż, chcę tam usunąć element znajdujący się w IEnumerable. Jednak jest problem, ponieważ nie ma tam funkcji Remove, a użycie Except, Where itp. wymusi na mnie ponowne przypisanie do listOfItems, przez co Entity Framework straci do niej referencje - i w konsekwencji nic się z bazy danych nie usunie.

Ma ktoś pomysł w jaki sposób zaplanować funkcję tak, żeby działała poprawnie? Zmiana typu listOfItems na List oczywiście nic nie da bo przypisanie dwóch list różnych typów do siebie jest błędne.
AlfaLeporis

EDIT: Poprawione z List na DbSet

1

Oczywiście, że IEnumerable nie ma metody do usuwania. Niby czemu iterator miałby ją mieć?

Spróbuj tak:

List<Zaklad.Models.IOrderingItem> listOfItems = null;
///
listOfItems = (List<IOrderingItem>)db.Banners.Cast<IOrderingItem>();
0
somekind napisał(a):

Oczywiście, że IEnumerable nie ma metody do usuwania. Niby czemu iterator miałby ją mieć?

No to akurat nie jest dla mnie zaskoczeniem, napisałem żeby nie było że ktoś mnie źle zrozumiał... :)

somekind napisał(a):

Spróbuj tak:

List<Zaklad.Models.IOrderingItem> listOfItems = null;
///
listOfItems = (List<IOrderingItem>)db.Banners.Cast<IOrderingItem>();

Ten sposób wywali błąd rzutowania (z DbQuery na List), może dlatego że wcześniej lekko was zmyliłem - w rzeczywistości obiekty Banners i Articles są typu DbSet, a nie List jak wcześniej powiedziałem. Mea culpa.

W każdym razie dzięki za pomoc, w ostateczności mam w zanadrzu rozwiązanie które zdecydowanie nie jest ładne, ale jakoś działa. Jeżeli ktoś ma jeszcze jakieś propozycje dotyczące tego problemu to proszę o pomoc.

0

A tego DbSet nie można po prostu skonwertować do List metodą ToList?

1 użytkowników online, w tym zalogowanych: 0, gości: 1