На първо място, IQueryable‹T› разширява интерфейса на IEnumerable‹T›, така че всичко, което можете да направите с „обикновен“ IEnumerable‹T›, можете да направите и с IQueryable‹T› .

Това, което IQueryable‹T› има, което IEnumerable‹T› не, са по-специално две свойства – едното, което сочи към доставчик на заявки (напр. доставчик на LINQ към SQL) и друг, сочещ към израз на заявка, представляващ обекта IQueryable‹T› като абстрактно синтактично дърво, което може да бъде обходимо по време на изпълнение и което може да бъде разбрано от дадения доставчик на заявки (в по-голямата си част не можете да дадете израз на LINQ to SQL към доставчик на LINQ to Entities, без да се хвърля изключение).

  • IEnumerable‹T› е страхотен за работа с последователности, които се повтарят в паметта, но
  • IQueryable‹T› позволява неща с недостиг на памет като отдалечен източник на данни, като база данни или уеб услуга.

Първата важна точка, която трябва да запомните, е, че интерфейсът на IQueryable наследява от IEnumerable, така че каквото може да прави IEnumerable, IQueryable също може да прави.

Има много разлики, но нека обсъдим една голяма разлика, която прави най-голямата разлика. Интерфейсът IEnumerable е полезен, когато вашата колекция се зарежда с помощта на LINQ или Entity framework и искате да приложите филтър към колекцията.

Разгледайте долния прост код, който използва IEnumerable с рамка на обект. Той използва филтър Where, за да получи записи, чийто EmpId е 2.

EmpEntities ent = new EmpEntities();
IEnumerable‹Employee› emp = ent.Employees;
IEnumerable‹Employee› temp = emp.Where(x =› x.Empid == 2).ToList‹Employee›();

Тук филтърът се изпълнява от страната на клиента, където е кодът на IEnumerable. С други думи, всички данни се извличат от базата данни и след това при клиента сканира и получава записа с EmpId е 2.

Но сега вижте кода по-долу, ние променихме IEnumerable на IQueryable. Той създава SQL заявка от страната на сървъра и само необходимите данни се изпращат на страната на клиента.

EmpEntities ent = new EmpEntities();
IQueryable‹Employee› emp = ent.Employees;
IQueryable‹Employee› temp = emp.Where(x =› x.Empid == 2).ToList‹Employee ›();

Така че разликата между IQueryable и IEnumerable е в това къде се изпълнява логиката на филтъра. Единият се изпълнява от страна на клиента, а другият се изпълнява в базата данни. Така че, ако работите само със събиране на данни в паметта, IEnumerable е добър избор, но ако искате да направите заявка за събиране на данни, което е свързано с база данни, `IQueryable е по-добър избор, тъй като намалява мрежовия трафик и използва силата на SQL езика.

IEnumerable: IEnumerable е най-подходящ за работа с колекция в паметта (или локални заявки). IEnumerable не се движи между елементи, това е колекция само за напред.

IQueryable: IQueryable е най-подходящ за отдалечен източник на данни, като база данни или уеб услуга (или отдалечени заявки). IQueryable е много мощна функция, която позволява различни интересни сценарии за отложено изпълнение (като заявки, базирани на страниране и композиция).