مثال 1: تمام اطلاعات یک جدول را دریافت کنید.
هدف دریافت تمام اطلاعات جدول facilities است.
برای انجام اینکار فقط کافیاست بر روی DbSet متناظر با آن، متد ToList فراخوانی شود:
var facilities = context.Facilities.ToList();
یک نکته: به فراخوانی متد ToList، اصطلاحا materialization گفته میشود و هدف آن تبدیل یک IQueryable، به یک IEnumerable است. اطلاعات بیشتر
مثال 2: اطلاعات ستونهای خاصی از یک جدول را دریافت کنید.
میخواهیم لیست نام امکانات مجموعه را به همراه هزینهی مرتبط با آنها، نمایش دهیم:
var facilities = context.Facilities.Select(x => new { x.Name, x.MemberCost }).ToList();
مثال 3: نحوهی بازگشت ردیفها را کنترل کنید.
چگونه میتوان لیست امکاناتی را بازگشت داد که برای کاربران رایگان نیستند؟
var facilities = context.Facilities.Where(x => x.MemberCost > 0).ToList();
مثال 4: نحوهی بازگشت ردیفها را کنترل کنید؛ قسمت دوم.
چگونه میتوان لیست امکاناتی را بازگشت داد که برای کاربران رایگان نیستند و همچنین هزینهی آنها، 1/50 ام هزینهی نگهداری ماهیانهی آنها است؟ خروجی این کوئری باید تنها به همراه ستونهای FacId, Name, MemberCost, MonthlyMaintenance باشد.
var facilities = context.Facilities.Where(x => x.MemberCost > 0 && x.MemberCost < (x.MonthlyMaintenance / 50)) .Select(x => new { x.FacId, x.Name, x.MemberCost, x.MonthlyMaintenance }).ToList();
در این مثال نحوهی ترکیب چند شرط را با هم در قسمت Where، مشاهده میکنید و همچنین با استفاده از متد Select، تعداد ستونهای بازگشتی نیز کنترل شدهاند.
مثال 5: جستجوهای سادهی رشتهای
لیستی از امکاناتی را تهیه کنید که واژهی «Tennis» در نام آنها بکار رفتهاست.
var facilities = context.Facilities.Where(x => x.Name.Contains("Tennis")).ToList();
مثال 6: ردیفهایی را که با چندین مقدار ممکن تطابق دارند، بازگشت دهید.
چگونه میتوان امکانات دارای ID مساوی 1 و 5 را بازگشت داد؟ برای اینکار از ترکیب شرطها با استفاده از OR استفاده نکنید.
int[] ids = { 1, 5 }; var facilities = context.Facilities.Where(x => ids.Contains(x.FacId)).ToList();
مثال 7: نتایج بازگشت داده شده را طبقه بندی کنید.
گزارشی از امکانات را تهیه کنید که در آن اگر هزینهی نگهداری ماهیانهی امکاناتی بیشتر از 100 دلار بود، به صورت expensive و در غیراینصورت cheap، طبقه بندی شوند.
var facilities = context.Facilities .Select(x => new { x.Name, Cost = x.MonthlyMaintenance > 100 ? "expensive" : "cheap" }).ToList();
مثال 8: کار با تاریخ و زمان
لیست کاربرانی را بازگشت دهید که پس از September 2012 عضو این مجموعه شدهاند. این گزارش باید تنها به همراه ستونهای MemId, Surname, FirstName, JoinDate باشد.
var date = new DateTime(2012, 09, 01); var members = context.Members.Where(x => x.JoinDate >= date) .Select(x => new { x.MemId, x.Surname, x.FirstName, x.JoinDate }).ToList();
مثال 9: نتایج تکراری را از اطلاعات بازگشتی حذف کرده و آنها را مرتب کنید.
گزارشی را تهیه کنید که در آن تنها فیلد Surname مرتب شدهی کاربران وجود دارد. از لیست Surnameها، تنها 10 مورد غیر تکراری را بازگشت دهید.
var members = context.Members.OrderBy(x => x.Surname) .Select(x => new { x.Surname }) .Distinct() .Take(10) .ToList();
مثال 10: نتایج چند کوئری را با هم ترکیب کنید.
لیست نامهای امکانات و نامهای اشخاص را با هم ترکیب کنید.
var names = context.Members.Select(m => m.Surname).ToList() .Union(context.Facilities.Select(f => f.Name).ToList()) // For now we have to use `.ToList()` here .ToList();
SELECT surname FROM members UNION SELECT name FROM facilities;
یعنی در مثال فوق، دوبار رفت و برگشت به بانک اطلاعاتی صورت گرفته (به ازای هر ToList ذکر شده) و سپس نتیجهی حاصل، در سمت کلاینت با هم Union شدهاند و نه در سمت دیتابیس.
مثال 11: محاسبات تجمعی ابتدایی
زمان ثبت نام آخرین عضو مجموعه چیست؟
برای حل این مثال میتوان از روشهای مختلفی استفاده کرد:
الف) استفاده از متد تجمعی Max برای یافتن بزرگترین مقدار JoinDate
var latest = context.Members.Max(x => x.JoinDate);
متد Max برای خواص nullable میتواند null را بازگشت دهد و همچنین اگر این مجموعه دارای مقداری نباشد و آن خاصیت نیز nullable نباشد، استثنای Sequence contains no element را صادر میکند. میتوان این استثناء را به صورت زیر با استفاده از متد DefaultIfEmpty کنترل کرد:
var latest2 = context.Members.Select(m => m.JoinDate).DefaultIfEmpty().Max();
SELECT MAX([m].[JoinDate]) FROM (SELECT NULL AS [empty]) AS [empty] LEFT OUTER JOIN [Members] AS [m] ON 1 = 1;
var latest3 = context.Members.Max(m => (DateTime?)m.JoinDate) ?? DateTime.Now;
ب) بجای استفاده از متد Max میتوان ابتدا رکوردها را بر اساس JoinDate به صورت نزولی مرتب کرد و سپس اولین عضو حاصل را بازگشت داد؛ چون اکنون بر اساس مرتب سازی صورت گرفته، در بالای لیست قرار دارد:
var latest4 = context.Members.OrderByDescending(m => m.JoinDate).Select(m => m.JoinDate).FirstOrDefault();
مثال 12: مثالی دیگر از محاسبات تجمعی ابتدایی
در مثال قبلی، نام و نام خانوادگی آخرین شخص ثبت نام شده را نیز به گزارش اضافه کنید؛ یعنی Select انجام شده شامل x.FirstName, x.Surname, x.JoinDate باشد.
یک روش انجام اینکار، همان کوئری ب مثال قبلی است که اینبار فقط Select آن فرق میکند:
var lastMember = context.Members.OrderByDescending(m => m.JoinDate) .Select(x => new { x.FirstName, x.Surname, x.JoinDate }) .FirstOrDefault();
روش دیگر آن نوشتن یک sub-query در قسمت Where است:
var members = context.Members.Select(x => new { x.FirstName, x.Surname, x.JoinDate }) .Where(x => x.JoinDate == context.Members.Max(x => x.JoinDate)) .ToList();
کدهای کامل این قسمت را در اینجا میتوانید مشاهده کنید.