/// <summary> /// Gets a count of activities using the specified <see cref="SessionActivityGroupFields" /> to create a <see cref="SessionActivityGroupKey" />. /// </summary> /// <param name="groupFields">The <see cref="SessionActivityGroupFields" /> indicated which fields to group by.</param> /// <returns>A collection of <see cref="SessionActivityCount" /> objects grouped according to <see cref="SessionActivityGroupFields" />.</returns> public IQueryable <SessionActivityCount> ActivityCounts(SessionActivityGroupFields groupFields) { var keySelector = SessionActivityGroupKey.CreateGroupKey(groupFields); return(Activities.GroupBy(keySelector).Select(SessionActivityCount.BuildFromGrouping)); }
/// <summary> /// Gets a LINQ-to-entities compatible expression to group <see cref="SessionActivityData" /> by status. /// </summary> internal static Expression <Func <SessionActivityData, SessionActivityGroupKey> > CreateGroupKey(SessionActivityGroupFields fields) { // Check the flags to see which fields should be grouped bool groupByName = fields.HasFlag(SessionActivityGroupFields.ActivityName); bool groupByType = fields.HasFlag(SessionActivityGroupFields.ActivityType); bool groupByUser = fields.HasFlag(SessionActivityGroupFields.UserName); bool groupByHost = fields.HasFlag(SessionActivityGroupFields.HostName); bool groupByStartTime = fields.HasFlag(SessionActivityGroupFields.StartDateTime); bool groupByEndTime = fields.HasFlag(SessionActivityGroupFields.EndDateTime); bool groupByStatus = fields.HasFlag(SessionActivityGroupFields.Status); bool groupByMessage = fields.HasFlag(SessionActivityGroupFields.ResultMessage); bool groupByCategory = fields.HasFlag(SessionActivityGroupFields.ResultCategory); // Create a new group key that includes or ignores fields depending on whether the flag was set. // StartDateTime and EndDateTime use a DbFunction to create a new DateTime that rounds down to the nearest minute. return(n => new SessionActivityGroupKey { ActivityName = groupByName ? n.ActivityName : null, ActivityType = groupByType ? n.ActivityType : null, UserName = groupByUser ? n.UserName : null, HostName = groupByHost ? n.HostName : null, Status = groupByStatus ? n.Status : null, ResultMessage = groupByMessage ? n.ResultMessage : null, ResultCategory = groupByCategory ? n.ResultCategory : null, StartDateTime = groupByStartTime ? DbFunctions.CreateDateTime(n.StartDateTime.Value.Year, n.StartDateTime.Value.Month, n.StartDateTime.Value.Day, n.StartDateTime.Value.Hour, n.StartDateTime.Value.Minute, 0) : null, EndDateTime = groupByEndTime ? DbFunctions.CreateDateTime(n.EndDateTime.Value.Year, n.EndDateTime.Value.Month, n.EndDateTime.Value.Day, n.EndDateTime.Value.Hour, n.EndDateTime.Value.Minute, 0) : null }); }