مثال 1: چه تعداد امکانات، توسط این مجموعه ارائه میشود؟
var count = context.Facilities.Count();
مثال 2: چه تعداد امکانات گران قیمتی توسط این مجموعه ارائه میشود؟
میخواهیم تعداد امکاناتی را بیابیم که guestcost آنها بزرگتر یا مساوی 10 است.
var count = context.Facilities.Count(x => x.GuestCost >= 10);
مثال 3: هر کاربر چه تعدادی کاربر دیگری را توصیه کردهاست؟
خروجی این گزارش بر اساس recommendedby و count باشد و مرتب شدهی بر اساس ID افراد.
var members = context.Members .Where(member => member.RecommendedBy != null) .GroupBy(member => member.RecommendedBy) .Select(group => new { RecommendedBy = group.Key, Count = group.Count() }) .OrderBy(result => result.RecommendedBy) .ToList();
مثال 4: تعداد slots رزرو شدهی به ازای هر کدام از امکانات موجود را نمایش دهید.
جهت یادآوری از قسمت اول: «هر رزرو کردن مکان و امکاناتی در این مجموعه، «نیم ساعته» است. بنابراین Slots در اینجا به معنای تعداد نیم ساعتهای رزرو کردن یک مکان خاص است؛ که به آن «half hour slots» نیز گفته میشود و زمان شروع این رزرو نیز ثبت میشود.»
خروجی این گزارش بر اساس facid و Total Slots باشد و مرتب شدهی بر اساس ID هر امکان موجود.
var facilities = context.Bookings .GroupBy(booking => booking.FacId) .Select(group => new { FacId = group.Key, TotalSlots = group.Sum(booking => booking.Slots) }) .OrderBy(result => result.FacId) .ToList();
مثال 5: تعداد slots رزرو شدهی در ماه September 2012 را به ازای هر کدام از امکانات موجود، نمایش دهید.
خروجی این گزارش بر اساس facid و Total Slots باشد و مرتب شدهی بر اساس ID تعداد slots.
var date1 = new DateTime(2012, 09, 01); var date2 = new DateTime(2012, 10, 01); var facilities = context.Bookings .Where(booking => booking.StartTime >= date1 && booking.StartTime < date2) .GroupBy(booking => booking.FacId) .Select(group => new { FacId = group.Key, TotalSlots = group.Sum(booking => booking.Slots) }) .OrderBy(result => result.TotalSlots) .ToList();
مثال 6: محاسبه کنید در سال 2012 و به ازای هر ماه مجزای آن، چه تعداد slots رزرو شدهاند.
خروجی این گزارش بر اساس facid, month, Total Slots باشد و مرتب شدهی بر اساس ID و شمارهی ماه.
var date1 = new DateTime(2012, 01, 01); var date2 = new DateTime(2013, 01, 01); var facilities = context.Bookings .Where(booking => booking.StartTime >= date1 && booking.StartTime < date2) .GroupBy(booking => new { booking.FacId, booking.StartTime.Month }) .Select(group => new { group.Key.FacId, group.Key.Month, TotalSlots = group.Sum(booking => booking.Slots) }) .OrderBy(result => result.FacId) .ThenBy(result => result.Month) .ToList();
الف) میتوان گروه بندی را بر روی بیش از یک ستون اعمال کرد. در این حالت در Select بعدی، group.Key به کل شیء گروه بندی شده، اشاره میکند.
ب) روش انتخاب ماه میلادی از یک خاصیت DateTime و گروه بندی بر اساس آن
که به صورت زیر ترجمه میشود:
مثال 7: چه تعداد کاربر مجموعه، حداقل یکبار امکاناتی را رزرو کردهاند؟
var count = context.Bookings.Select(booking => booking.MemId).Distinct().Count();
- (*)COUNT یعنی بازگشت تعداد ردیفهای نهایی گزارش.
- COUNT(address) یعنی بازگشت تعداد آدرسهای غیرنال، در کل ردیفهای نهایی گزارش.
- COUNT(DISTINCT address) یعنی بازگشت تعداد آدرسهای غیرمشابه در کل ردیفهای نهایی گزارش.
COUNT DISTINCT را EF-Core به صورت ترکیبی از یک sub-query ترجمه میکند:
مثال 8: امکاناتی را لیست کنید که بیش از 1000 slots رزرو شده دارند.
خروجی این گزارش بر اساس facid و Total Slots باشد و مرتب شدهی بر اساس ID هر امکان موجود.
var facilities = context.Bookings .GroupBy(booking => booking.FacId) .Select(group => new { FacId = group.Key, TotalSlots = group.Sum(booking => booking.Slots) }) .Where(result => result.TotalSlots > 1000) .OrderBy(result => result.FacId) .ToList();
مثال 9: میزان فروش کل هر امکان موجود را محاسبه کنید.
خروجی این گزارش بر اساس name, revenue باشد و مرتب شدهی بر اساس میزان فروش. بخاطر داشته باشید که میزان فروش کاربران ثبت نام شده با کاربران مهمان یکی نیست.
var facilities = context.Bookings.Select(booking => new { booking.Facility.Name, Revenue = booking.MemId == 0 ? booking.Slots * booking.Facility.GuestCost : booking.Slots * booking.Facility.MemberCost }) .GroupBy(b => b.Name) .Select(group => new { Name = group.Key, TotalRevenue = group.Sum(b => b.Revenue) }) .OrderBy(result => result.TotalRevenue) .ToList();
مثال 10: کدامیک از امکانات موجود، میزان فروشی کمتر از 1000 داشتهاند؟
خروجی این گزارش بر اساس name, revenue باشد و مرتب شدهی بر اساس میزان فروش. بخاطر داشته باشید که میزان فروش کاربران ثبت نام شده با کاربران مهمان یکی نیست.
var facilities = context.Bookings.Select(booking => new { booking.Facility.Name, Revenue = booking.MemId == 0 ? booking.Slots * booking.Facility.GuestCost : booking.Slots * booking.Facility.MemberCost }) .GroupBy(b => b.Name) .Select(group => new { Name = group.Key, TotalRevenue = group.Sum(b => b.Revenue) }) .Where(result => result.TotalRevenue < 1000) .OrderBy(result => result.TotalRevenue) .ToList();
مثال 11: کدامیک از امکانات موجود، بیشترین slots رزرو شده را دارد؟
var item = context.Bookings .GroupBy(booking => booking.FacId) .Select(group => new { FacId = group.Key, TotalSlots = group.Sum(booking => booking.Slots) }) .OrderByDescending(result => result.TotalSlots) .FirstOrDefault();
کدهای کامل این قسمت را در اینجا میتوانید مشاهده کنید.