示例#1
0
        /// <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
            });
        }