IList (IList<T>) iš karto sukuria nuolatinius duomenis atmintyje, kuri neįgyvendina "atidėto vykdymo", o jei įkeltas objektas turi susietų objektų, susietas objektas nebus įkeltas (nei iš karto, nei tingus).
IQeurable <T>iš karto nesukuria nuolatinių duomenų atmintyje, o tik įkelia duomenis į atmintį, jei jie yra perkeliami (pvz., per forreach), konvertuojami į sąrašą ir pan., ir gali pasiekti "atidėtą vykdymą", jei šiuo metu įkeltas objektas turi asociacijų, šis susietas objektas gali būti įkeltas per kitą prieigą.
Pažvelkite į šią kodo dalį:
//IList的情况 IList vartotojai = res. ToList(); Vartotojai buvo įkelti į atmintį, bet susietas objektas (UserInfos) kiekvienam vartotojui nebuvo yra įkeltas, todėl kita kodo eilutė nepraeina sklandžiai var ss = vartotojai. Kur(p = > p.UserInfos.ID != 3); Čia pranešama apie klaidą, nes P objekto UserInfos įkelti negalima
IQuerable situacija IQueryable vartotojai = res. AsQueryable(); Vartotojai neįkeliami iš karto, o susietą objektą galima gauti "tingiai įkeliant" Supratau var ss = vartotojai. Kur(p = > p.UserInfos.ID != 3); Atitinkamas SS buvo sėkmingai gautas čia |