‫IEnumerable و IQueryable

اگر می‌خواهید از یک کوئری LINQ به عنوان خروجی یک متود استفاده کنید دو راه برای آن وجود دارد. یکی آن که خروجی متود را از نوع IEnumerable تعریف کنیم و یکی دیگر آن که خروجی آن را از نوع IQueryable تعریف کنیم. استفاده از IEnumerable به معنی پایین آمدن Performance است. به همین دلیل بهتر است از IQueryable استفاده کنیم. نکته‌ی جالب‌تری که فهمیدم این است که اگر از IEnumerable به عنوان خروجی متود استفاده شود دیگر نمی‌توان از متودهایی نظیر Skip و Take که در Data Pagination استفاده زیادی دارند استفاده کرد. به عنوان مثال به کد زیر دقت کنید:
IEnumerable MakeQuery()
{
  var query = from m in session.Linq()
              select m;
  return query;
}

List m1()
{
  return MakeQuery()
    .Skip(10)
    .Take(20)
    .ToList();
}
توابع Skip و Take در متود m1 بی‌تاثیر هستند. البته نه این که عمل نمی‌کنند بلکه باعث می‌شوند کل دیتا از منبع مورد نظر، که در مورد من Linq-to-NHibernate و دیتابیس بود، فراخوانی شوند نه آن که صرفاً آن بخش خاص بازیابی شوند.