کوئری نویسی در EF Core - قسمت پنجم - اعمال تجمعی - بخش دوم
نویسنده: وحید نصیری
تاریخ: ۱۳۹۹/۰۵/۱۰ ۱۴:۵۰
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
SELECT facid,
DATEPART(month, [StartTime]) AS month,
sum(slots) AS slots
FROM bookings
WHERE starttime >= '2012-01-01'
AND starttime < '2013-01-01'
GROUP BY ROLLUP(facid, DATEPART(month, [StartTime]))
ORDER BY facid, month; 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()
//This is new
.GroupByWithRollup(
item => item.FacId,
item => item.Month,
(primaryGrouping, secondaryGrouping) => new
{
FacId = primaryGrouping.Key,
Month = secondaryGrouping.Key,
TotalSlots = secondaryGrouping.Sum(item => item.TotalSlots)
},
item => new
{
FacId = item.Key,
Month = -1,
TotalSlots = item.SubTotal(subItem => subItem.TotalSlots)
},
items => new
{
FacId = -1,
Month = -1,
TotalSlots = items.GrandTotal(subItem => subItem.TotalSlots)
}); var items = context.Bookings
.GroupBy(booking => new { booking.FacId, booking.Facility.Name })
.Select(group => new
{
group.Key.FacId,
group.Key.Name,
TotalHours = group.Sum(booking => booking.Slots) / 2M
})
.OrderBy(result => result.FacId)
.ToList();
var date1 = new DateTime(2012, 09, 01);
var items = context.Bookings
.Where(booking => booking.StartTime >= date1)
.GroupBy(booking => new
{
booking.Member.Surname,
booking.Member.FirstName,
booking.Member.MemId
})
.Select(group => new
{
group.Key.Surname,
group.Key.FirstName,
group.Key.MemId,
StartTime = group.Min(booking => booking.StartTime)
})
.OrderBy(result => result.MemId)
.ToList();
var members = context.Members
.OrderBy(member => member.JoinDate)
.Select(member => new
{
Count = context.Members.Count(),
member.FirstName,
member.Surname
})
.ToList(); SELECT COUNT(*) FROM [Members] AS [m]; SELECT [m].[FirstName], [m].[Surname], @__Count_0 AS [Count] FROM [Members] AS [m] ORDER BY [m].[JoinDate];
SELECT row_number() OVER (ORDER BY joindate) AS row_number, firstname, surname FROM members ORDER BY joindate;
var members = context.Members
.OrderBy(member => member.JoinDate)
.Select(member => new
{
member.FirstName,
member.Surname
})
.ToList()
/*
SELECT [m].[FirstName], [m].[Surname]
FROM [Members] AS [m]
ORDER BY [m].[JoinDate]
*/
// Now using LINQ to Objects
.Select((member, index) => new
{
RowNumber = index + 1,
member.FirstName,
member.Surname
})
.ToList(); SELECT facid,
total
FROM (SELECT facid,
sum(slots) AS total,
rank() OVER (ORDER BY sum(slots) DESC) AS rank
FROM bookings
GROUP BY facid) AS ranked
WHERE rank = 1; SELECT mems.firstname,
mems.surname,
((sum(bks.slots) + 10) / 20) * 10 AS hours,
rank() OVER (ORDER BY ((sum(bks.slots) + 10) / 20) * 10 DESC) AS rank
FROM bookings AS bks
INNER JOIN
members AS mems
ON bks.memid = mems.memid
GROUP BY mems.firstname,
mems.surname
ORDER BY rank, mems.surname, mems.firstname; var itemsQuery = context.Bookings
.GroupBy(booking => new
{
booking.Member.FirstName,
booking.Member.Surname
})
.Select(group => new
{
group.Key.FirstName,
group.Key.Surname,
Hours = (group.Sum(booking => booking.Slots) + 10) / 20 * 10
})
.OrderByDescending(result => result.Hours)
.ThenBy(result => result.Surname)
.ThenBy(result => result.FirstName);
var rankedItems = itemsQuery.Select(thisItem => new
{
thisItem.FirstName,
thisItem.Surname,
thisItem.Hours,
Rank = itemsQuery.Count(mainItem => mainItem.Hours > thisItem.Hours) + 1
})
.ToList();
var facilitiesQuery =
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);
var rankedFacilities = facilitiesQuery.Select(thisItem => new
{
thisItem.Name,
thisItem.TotalRevenue,
Rank = facilitiesQuery.Count(mainItem => mainItem.TotalRevenue > thisItem.TotalRevenue) + 1
})
.Where(result => result.Rank <= 3)
.OrderBy(result => result.Rank)
.ToList();
SELECT name,
CASE WHEN class = 1 THEN 'high' WHEN class = 2 THEN 'average' ELSE 'low' END AS revenue
FROM (SELECT facs.name AS name,
ntile(3) OVER (ORDER BY sum(CASE WHEN memid = 0 THEN slots * facs.guestcost ELSE slots * membercost END) DESC) AS class
FROM bookings AS bks
INNER JOIN
facilities AS facs
ON bks.facid = facs.facid
GROUP BY facs.name) AS subq
ORDER BY class, name; 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)
})
.OrderByDescending(result => result.TotalRevenue)
.ToList(); SELECT [f].[Name], SUM(CASE WHEN [b].[MemId] = 0 THEN CAST ([b].[Slots] AS DECIMAL (18, 6)) * [f].[GuestCost] ELSE CAST ([b].[Slots] AS DECIMAL (18, 6)) * [f].[MemberCost] END) AS [TotalRevenue] FROM [Bookings] AS [b] INNER JOIN [Facilities] AS [f] ON [b].[FacId] = [f].[FacId] GROUP BY [f].[Name] ORDER BY SUM(CASE WHEN [b].[MemId] = 0 THEN CAST ([b].[Slots] AS DECIMAL (18, 6)) * [f].[GuestCost] ELSE CAST ([b].[Slots] AS DECIMAL (18, 6)) * [f].[MemberCost] END) DESC;
var n = 3;
var tiledFacilities = facilities.Select((item, index) =>
new
{
Item = item,
Index = (index / n) + 1
})
.GroupBy(x => x.Index)
.Select(g =>
g.Select(z =>
new
{
z.Item.Name,
z.Item.TotalRevenue,
Tile = g.Key,
GroupName = g.Key == 1 ? "High" : (g.Key == 2 ? "Average" : "Low")
})
.OrderBy(x => x.GroupName)
.ThenBy(x => x.Name)
)
.ToList();
var flatTiledFacilities = tiledFacilities.SelectMany(group => group)
.Select(tile => new { tile.Name, Revenue = tile.GroupName })
.ToList(); var facilities =
context.Bookings.Select(booking =>
new
{
booking.Facility.Name,
booking.Facility.InitialOutlay,
booking.Facility.MonthlyMaintenance,
Revenue = booking.MemId == 0 ?
booking.Slots * booking.Facility.GuestCost
: booking.Slots * booking.Facility.MemberCost
})
.GroupBy(b => new
{
b.Name,
b.InitialOutlay,
b.MonthlyMaintenance
})
.Select(group => new
{
group.Key.Name,
RepayTime =
group.Key.InitialOutlay /
((group.Sum(b => b.Revenue) / 3) - group.Key.MonthlyMaintenance)
})
.OrderBy(result => result.Name)
.ToList();
var startDate = new DateTime(2012, 08, 1);
var endDate = new DateTime(2012, 08, 31);
var period = 14;
var dailyRevenueQuery =
context.Bookings
.Select(booking =>
new
{
StartDate = booking.StartTime.Date, // How to group by date (or TruncateTime) in EF-Core
Revenue = booking.MemId == 0 ?
booking.Slots * booking.Facility.GuestCost
: booking.Slots * booking.Facility.MemberCost
})
.GroupBy(b => b.StartDate)
.Select(group =>
new
{
Date = group.Key,
TotalRevenue = group.Sum(b => b.Revenue)
}); var movingAvgs =
dailyRevenueQuery
.Select(dr1 =>
new
{
dr1.Date,
MovingAvg = dailyRevenueQuery
.Where(dr2 => dr2.Date <= dr1.Date && dr2.Date >= dr1.Date.AddDays(-period))
.Average(dr2 => dr2.TotalRevenue)
})
.Where(result => result.Date >= startDate && result.Date <= endDate)
.OrderBy(result => result.Date)
.ToList();
dotnet add package linq2db.EntityFrameworkCore
LinqToDB.EntityFrameworkCore.LinqToDBForEFTools.Initialize(); LinqToDB.Data.DataConnection.TurnTraceSwitchOn();
var runningTotalCountForEachYear = context.Bookings
.Select(booking => new
{
booking.StartTime.Year,
RunningTotalCount =
Sql.Ext.Count(booking.StartTime)
.Over()
.OrderBy(booking.StartTime.Year)
.ToValue()
})
.OrderBy(result => result.Year)
.Distinct()
.ToLinqToDB()
.ToList(); SELECT DISTINCT
DatePart(year, [booking].[StartTime]),
COUNT([booking].[StartTime]) OVER(ORDER BY DatePart(year, [booking].[StartTime]))
FROM
[Bookings] [booking]
ORDER BY
DatePart(year, [booking].[StartTime])