public static List <StudentDemographicInfo> Get(Criteria criteria) { using (var context = new OsbideProcs()) { var minDate = new DateTime(2000, 1, 1); var anyValue = -1; return((from p in context.GetProcedureData((!criteria.DateFrom.HasValue || criteria.DateFrom < minDate) ? minDate : criteria.DateFrom, (!criteria.DateTo.HasValue || criteria.DateTo < minDate) ? DateTime.Today : criteria.DateTo, criteria.StudentId.HasValue ? criteria.StudentId.Value : anyValue, criteria.NameToken == null ? string.Empty : criteria.NameToken, criteria.GenderId, criteria.AgeFrom, criteria.AgeTo, criteria.CourseId, criteria.Deliverable, criteria.GradeFrom.HasValue ? criteria.GradeFrom.Value : anyValue, criteria.GradeTo.HasValue ? criteria.GradeTo.Value : anyValue) select new StudentDemographicInfo { Name = p.FirstName + " " + p.LastName, Age = p.Age, Class = p.Prefix + " " + p.CourseNumber + ", " + p.Season + " " + p.Year, Gender = p.Gender, Deliverable = p.Deliverable, Ethnicity = p.Ethnicity, Id = p.UserId, InstitutionId = p.InstitutionId, Grade = p.Grade, }).ToList()); } }
public static IEnumerable <Comment> Get(string logIds, int currentUserId) { using (var context = new OsbideProcs()) { return(ReadResults(context.GetComments(logIds, currentUserId))); } }
public static IEnumerable <ErrorListItem> Get(int?senderId, DateTime?timeframe) { using (var context = new OsbideProcs()) { return(ReadResults(context.GetRecentCompileErrors(senderId, timeframe))); } }
public static List <StudentDemographicInfo> Get(Criteria criteria) { using (var context = new OsbideProcs()) { var minDate = new DateTime(2000, 1, 1); return((from p in context.GetProcedureData(criteria.DateFrom < minDate ? minDate : criteria.DateFrom, criteria.DateTo < minDate ? DateTime.Today : criteria.DateTo, criteria.NameToken, criteria.GenderId, criteria.AgeFrom, criteria.AgeTo, criteria.CourseId, criteria.Year, criteria.GradeFrom, criteria.GradeTo, criteria.OverallGradeFrom, criteria.OverallGradeTo) select new StudentDemographicInfo { Name = p.Name, Age = p.Age, Class = p.Class_Class, Gender = p.Gender_Gend, Year = p.Year, Quarter = p.Semester, Ethnicity = p.Ethnicity_Ethn, Id = p.Id, InstitutionId = p.InstitutionId, Grade = 100, OverallGrade = 100, }).ToList()); } }
public static void Update(int?postid, int?userid, bool val) { using (var context = new OsbideProcs()) { context.MarkRead(postid, userid, val); } }
public static CloudTable GetTableReference(string tableName) { try { var storageAccount = CloudStorageAccount.Parse(ConfigurationManager.AppSettings["StorageConnectionString"]); var tableClient = storageAccount.CreateCloudTableClient(); var table = tableClient.GetTableReference(tableName); if (table.CreateIfNotExists()) { // log a record in PassiveSocialEventProcessLog table using (var context = new OsbideProcs()) { context.InsertPassiveSocialEventProcessLog(table.Name); } } return(table); } catch (Exception ex) { // need to do this due to the unstability of Azure var msg = ex.Message; throw; } }
public static List <int> GetDocUsers() { using (var context = new OsbideProcs()) { return((from p in context.GetBuildDocUtilUsers() select p.Value).ToList()); } }
public static DailyAggregations GetDailyAggregates(DateTime?startDate, DateTime?endDate, List <int> users, int?courseId, string selectedMeasures, bool isAvg) { using (var context = new OsbideProcs()) { var selectedMeasureNames = string.IsNullOrWhiteSpace(selectedMeasures) ? string.Empty : string.Join(",", selectedMeasures.Split(',').Select(x => (MeasureType)Enum.Parse(typeof(MeasureType), x)).ToArray()); var dailyAggregatesRaw = context.GetCalendarMeasuresByDay(startDate, endDate, users == null? string.Empty : string.Join(",", users), courseId, selectedMeasureNames, isAvg) .GroupBy(x => x.Measure) .ToDictionary(x => x.Key, x => x.ToList()); if (dailyAggregatesRaw.Count > 0) { var measureDictionary = MeasureDefinitions.All.Values.SelectMany(x => x).ToList(); var activities = dailyAggregatesRaw.Values.SelectMany(x => x).ToList() .Where(x => x.Value < 0) // month starts from 0 to 11 in JavaScript!!! .Select(x => new Activity { Day = x.EventDay.Value.Day, Month = x.EventDay.Value.Month - 1, Name = x.Measure }) .ToList(); var measures = new List <Measure>(); foreach (var key in dailyAggregatesRaw.Keys) { if (dailyAggregatesRaw[key].Any(x => x.Value.HasValue && x.Value.Value > 0)) { var ms = measureDictionary.Where(x => x.MeasureType.ToString() == key).Single(); measures.Add( new Measure { Title = key.ToDisplayText(), DataPointShape = ms.DataPointShape, Color = ms.Color, // month starts from 0 to 11 in JavaScript!!! Aggregates = dailyAggregatesRaw[key].Select(x => new Aggregate { Day = x.EventDay.Value.Day, Month = x.EventDay.Value.Month - 1, Value = x.Value.Value }).ToList(), FirstDataPointMonth = dailyAggregatesRaw[key].Min(x => x.EventDay.Value).Month - 1, FirstDataPointDay = dailyAggregatesRaw[key].Min(x => x.EventDay.Value).Day, LastDataPointMonth = dailyAggregatesRaw[key].Max(x => x.EventDay.Value).Month - 1, LastDataPointDay = dailyAggregatesRaw[key].Max(x => x.EventDay.Value).Day, Avg = dailyAggregatesRaw[key].Average(x => x.Value.Value), Max = dailyAggregatesRaw[key].Max(x => x.Value.Value), Min = dailyAggregatesRaw[key].Min(x => x.Value.Value), }); } } return(new DailyAggregations { Activities = activities, Measures = measures }); } return(null); } }
public static List <Tag> Run(string query, bool isHandle) { using (var context = new OsbideProcs()) { return(context.GetHashtags(query, isHandle).Select(t => new Tag { Id = t.Id, Name = t.Tag, IsHandle = t.IsHandle }).ToList()); } }
public static List <ErrorFixTimeStats> Get() { using (var context = new OsbideProcs()) { return((from e in context.GetErrorFixTimeStats() select new ErrorFixTimeStats { ErrorTypeId = e.ErrorTypeId, Mean = e.Mean, SD = e.StandardDeviation, SDP = e.PopulationStandardDeviation, }).ToList()); } }
public static List <string> GetDeliverables(int courseId, DateTime?dateFrom = null, DateTime?dateTo = null) { using (var context = new OsbideProcs()) { if (!dateFrom.HasValue) { dateFrom = new DateTime(2010, 1, 1); } if (!dateTo.HasValue) { dateTo = DateTime.Today.AddDays(1); } return((from d in context.GetDeliverableLookup(courseId, dateFrom, dateTo) select d).ToList()); } }
public static IEnumerable <FeedItem> GetActivityFeeds(DateTime dateReceivedMin, DateTime dateReceivedMax, IEnumerable <int> logIds, IEnumerable <int> eventTypes, int?courseId, int?roleId, string commentFilter, IEnumerable <int> senderIds, int?minLogId, int?maxLogId, int offsetN, int?topN) { using (var context = new OsbideProcs()) { var c = commentFilter.Length > 0 ? string.Format("%{0}%", commentFilter) : string.Empty; var l = string.Join(",", logIds.Where(i => i > 0).ToArray()); var t = eventTypes.Count() > 0 ? string.Format("{0}", string.Join(",", eventTypes)) : string.Empty; var s = string.Join(",", senderIds.Where(i => i > 0).ToArray()); return(ReadResults(context.GetActivityFeeds(dateReceivedMin, dateReceivedMax, l, t, courseId, roleId, c, s, minLogId, maxLogId, offsetN, topN))); } }
public static List <CourseLookup> GetCourses() { using (var context = new OsbideProcs()) { var courses = (from c in context.GetCourseLookup() select new CourseLookup { CourseId = c.CourseId, DisplayText = c.CourseName }).ToList(); courses.Insert(0, new CourseLookup { CourseId = -1, DisplayText = "Any" }); return(courses); } }
public List <EventLogType> Get() { using (var context = new OsbideProcs()) { return((from e in context.GetEventTypes() select new EventLogType { LogTypeId = (EventType)e.LogTypeId, LogyTypeName = e.LogTypeName, DisplayName = e.DisplayName, IsSocial = e.IsSocial, IsIDE = e.IsIDE, IsFeed = e.IsFeed, }).ToList()); } }
public static List <AgeLookup> GetAges() { using (var context = new OsbideProcs()) { var ages = (from a in context.GetAgeLookup() select new AgeLookup { Age = a.Age.Value, DisplayText = a.Age.Value.ToString() }).ToList(); ages.Insert(0, new AgeLookup { Age = -1, DisplayText = "Any" }); return(ages); } }
public static List <GenderLookup> GetGenders() { using (var context = new OsbideProcs()) { return(new List <GenderLookup> { new GenderLookup { GenderId = (int)OSBIDE.Library.Models.Gender.Unknown, DisplayText = "Any" }, new GenderLookup { GenderId = (int)OSBIDE.Library.Models.Gender.Female, DisplayText = "Female" }, new GenderLookup { GenderId = (int)OSBIDE.Library.Models.Gender.Male, DisplayText = "Male" }, }); } }
public static List <DocUtilDetails> GetDocs(IEnumerable <int> userIds) { using (var context = new OsbideProcs()) { return((from p in context.GetBuildDocUtilBatch(string.Join(",", userIds.Where(x => x > 0))) select new DocUtilDetails { LogId = p.Id, UserId = p.SenderId, EventDate = p.EventDate, SolutionName = p.SolutionName, FileName = p.FileName, Document = p.Content, BuildId = p.BuildId, DocumentId = p.DocumentId, }) .ToList()); } }
public static List <TrendAndNotification> GetTrendAndNotification(int userId, int topN, bool getAll) { using (var context = new OsbideProcs()) { return(context.GetTrendsAndNotifications(userId, topN, getAll) .Select(t => new TrendAndNotification { FirstName = t.FirstName, LastName = t.LastName, Viewed = t.Viewed, UserId = t.UserId, EventLogId = t.EventLogId, HashtagId = t.HashtagId, Hashtag = t.Hashtag, HashtagCounts = t.Counts, }) .ToList()); } }
public static bool Run() { using (var context = new OsbideProcs()) { var prevProcessInfo = context.GetActiveSocialEventProcessInfo().ToList(); var pocessedLogId = prevProcessInfo.First().Info; var maxUnprocessedLogId = prevProcessInfo.Last().Info; var batches = (maxUnprocessedLogId - pocessedLogId) / BATCH_SIZE; for (var b = 0; b < batches + 1; b++) { var firstRow = pocessedLogId + b * BATCH_SIZE; var lastRow = pocessedLogId + (b + 1) * BATCH_SIZE < maxUnprocessedLogId ? pocessedLogId + (b + 1) * BATCH_SIZE : maxUnprocessedLogId + 1; DynamicSQLExecutor.Execute(string.Format(SQLTemplateUpdateActiveSocialEvents.Template, firstRow, lastRow)); } return(true); } }
private static List <ErrorTypeDetails> GetErrorTypes(OsbideProcs context, string eventLogIds, bool includeErrorFixInfo) { if (includeErrorFixInfo) { return((from e in context.GetWatwinScoringErrorTypeData(eventLogIds) select new ErrorTypeDetails { LogId = e.LogId, ErrorTypeId = e.BuildErrorTypeId, ErrorType = e.BuildErrorType, FixingTime = e.TimeToFix.HasValue ? e.TimeToFix.Value : 2592000, /*30 days in seconds*/ }).ToList()); } return((from e in context.GetErrorQuotientErrorTypeData(eventLogIds) select new ErrorTypeDetails { LogId = e.LogId, ErrorTypeId = e.ErrorTypeId, }).ToList()); }
public static bool Run(int schoolId) { using (var context = new OsbideProcs()) { // storage tables not completely processed foreach (var table in context.GetPassiveSocialEventProcessLog()) { var passiveSocialEvents = DomainObjectHelpers.GetPassiveSocialActivities(table.SourceTableName, schoolId).ToList(); var totalCounts = passiveSocialEvents.Count; var processedCounts = table.ProcessedRecordCounts.HasValue ? table.ProcessedRecordCounts.Value : 0; var batches = (totalCounts - processedCounts) / BATCH_SIZE; for (var b = 0; b < batches + 1; b++) { var tsql = new StringBuilder(); var firstRow = processedCounts + b * BATCH_SIZE; var lastRow = processedCounts + (b + 1) * BATCH_SIZE > totalCounts ? totalCounts : processedCounts + (b + 1) * BATCH_SIZE; for (var idx = firstRow; idx < lastRow; idx++) { var sql = GetSQLRowStatement(passiveSocialEvents[idx]); if (sql.Length > 0) { // build batch insert statements tsql.AppendFormat("{0}{1}", sql, Environment.NewLine); } } // batch execution and log updates DynamicSQLExecutor.Execute(tsql.ToString()); context.UpdatePassiveSocialEventProcessLog(table.Id, DESTINATIONTABLE, lastRow == totalCounts, lastRow); } } return(true); } }
public static List <TimelineChartData> Get(DateTime?dateFrom, DateTime?dateTo, IEnumerable <int> userIds, TimeScale timescale, int?timeout, bool grayscale, bool?realtime) { // need a min DateTime value to avoid SQL server param out of range var unspecifiedDate = new DateTime(2000, 1, 1); var timeFrom = dateFrom.HasValue ? dateFrom.Value : unspecifiedDate; var timeTo = dateTo.HasValue ? dateTo.Value : unspecifiedDate; var timeoutVal = timeout.HasValue ? timeout.Value : VisualizationParams.DEFAULT_TIMEOUT; using (var context = new OsbideProcs()) { // get raw data from database and sort by user and event time var rawR = realtime.HasValue && realtime.Value == true ? (from e in context.GetStateMachineEvents(timeFrom, timeTo, string.Join(",", userIds)) select e).ToList().OrderBy(x => x.SenderId).ThenBy(x => x.EventDate) : (from e in context.GetPrecalculatedStateMachineEvents(timeFrom, timeTo, string.Join(",", userIds)) select e).ToList().OrderBy(x => x.SenderId).ThenBy(x => x.EventDate); // set the actual data range if (timeFrom == unspecifiedDate) { timeFrom = rawR.Min(x => x.EventDate); } if (timeTo == unspecifiedDate) { timeTo = rawR.Max(x => x.EventDate); } var totalMinutes = (int)(timeTo - timeFrom).TotalMinutes; // chart data timeline var chartData = new List <TimelineChartData>(); var currentSolution = string.Empty; var prevStateName = ProgrammingState.edit_syn_u_sem_u; // previous build error is used for figuring out the next state of start without debugging event var lastBuildErrorLogId = rawR.First().BuildErrorLogId; foreach (var r in rawR) { // processing the flat events and compose a list of programming states for each user // the composed list of programming states are ordered by the event time // so the output is a collection of state timelines for the list of users var currEventTime = r.EventDate; var currEventPoint = (currEventTime - timeFrom).TotalMinutes; // init local variables if (string.Compare(r.SolutionName, currentSolution, true) != 0) { currentSolution = r.SolutionName; prevStateName = ProgrammingState.edit_syn_u_sem_u; } // process one user at a time var userData = chartData.SingleOrDefault(x => x.UserId == r.SenderId); // a new user's timeline? if (userData == null) { // yes, create a new timeline entry #region a new user timeline // since each bullet svg is drawn independently // the high level information needs to be passed into each svg drawing routine userData = new TimelineChartData { UserId = r.SenderId, title = string.Format("{0} {1}", r.FirstName, r.LastName), markers = new List <Point>(), measures = new List <State>(), }; // is the first event in idle timeout range? if ((currEventTime - timeFrom).TotalMinutes > timeoutVal) { // no, insert an idle state from the beginning to now prevStateName = ProgrammingState.idle; var uiproperties = TimelineStateDictionaries.UIProperties[prevStateName]; var idleState = new State { ProgrammingState = prevStateName, Name = uiproperties.Label, CssClass = grayscale ? uiproperties.CssGray : uiproperties.Css, StartTime = timeFrom, ShiftedStartTime = timeFrom, StartPoint = 0, EndTime = currEventTime, EndPoint = currEventPoint, }; userData.measures.Add(idleState); } else { // yes, insert a default programming state prevStateName = ProgrammingState.edit_syn_u_sem_u; var uiproperties = TimelineStateDictionaries.UIProperties[prevStateName]; var defaultState = new State { ProgrammingState = prevStateName, Name = uiproperties.Label, CssClass = grayscale ? uiproperties.CssGray : uiproperties.Css, StartTime = timeFrom, ShiftedStartTime = timeFrom, StartPoint = 0, EndTime = timeTo, EndPoint = totalMinutes, }; userData.measures.Add(defaultState); } chartData.Add(userData); #endregion // reset for a new user lastBuildErrorLogId = null; } // is this a social event? if (!string.IsNullOrWhiteSpace(r.MarkerType)) { // yes, add social media event marker userData.markers.Add(new Point { Name = r.MarkerType, Position = currEventPoint, EventTime = r.EventDate }); } else { // no, transition to next state based on the previous state // non-social event could be a state transition trigger // first to check the timespan between current and previous non-idle state events #region insert an idle state if the timespan between this event and previous event is too long var prevState = userData.measures.Last(); var prevEventTime = prevState.ShiftedStartTime; prevStateName = prevState.ProgrammingState; if ((currEventTime - prevEventTime).TotalMinutes > timeoutVal) { if (prevStateName == ProgrammingState.idle) { // extend the initial idle state to avoid the extra rectangle prevState.EndTime = currEventTime; prevState.EndPoint = currEventPoint; } else { #region add a new idle state prevStateName = ProgrammingState.idle; var uiproperties = TimelineStateDictionaries.UIProperties[prevStateName]; var idleState = new State { ProgrammingState = prevStateName, Name = uiproperties.Label, CssClass = grayscale ? uiproperties.CssGray : uiproperties.Css, StartTime = prevEventTime.AddMinutes(timeoutVal), StartPoint = (prevEventTime - timeFrom).TotalMinutes + timeoutVal, EndTime = currEventTime, EndPoint = currEventPoint, }; userData.measures.Add(idleState); // terminate previous non-idle state prevState.EndTime = idleState.StartTime; prevState.EndPoint = idleState.StartPoint; prevState = idleState; #endregion } } #endregion // resolve next state name from current state and current event #region get next programming state from state dictionaries var nextStateName = prevStateName; if (prevStateName == ProgrammingState.idle && prevState.StartTime > timeFrom) { // if currently in idle but not the first idle state, use the last non-idle state to calculate the next state prevStateName = userData.measures.Last(x => x.ProgrammingState != ProgrammingState.idle).ProgrammingState; } // look up next programming state from the transition tables if (string.Compare(r.LogType, "BuildEvent", true) == 0) { nextStateName = r.BuildErrorLogId.HasValue ? TimelineStateDictionaries.NextStateForBuildWithError[prevStateName] : TimelineStateDictionaries.NextStateForBuildWithoutError[prevStateName]; lastBuildErrorLogId = r.BuildErrorLogId.HasValue ? (int?)r.BuildErrorLogId.Value : null; } else if (string.Compare(r.LogType, "DebugEvent", true) == 0 && r.ExecutionActionId.HasValue) { nextStateName = GetNextStateForDebugEvent(userData, prevStateName, r.ExecutionActionId.Value, lastBuildErrorLogId); // the next event's previous event (this one) is not a build event lastBuildErrorLogId = null; } else if (string.Compare(r.LogType, "ExceptionEvent", true) == 0 && (prevStateName == ProgrammingState.debug_sem_u || prevStateName == ProgrammingState.idle)) { nextStateName = TimelineStateDictionaries.NextStateForExceptionEvent[prevStateName]; // the next event's previous event (this one) is not a build event lastBuildErrorLogId = null; } else if (TimelineStateDictionaries.EditorEvents.Any(x => string.Compare(x, r.LogType, true) == 0)) { nextStateName = TimelineStateDictionaries.NextStateForEditorEvent[prevStateName]; } #endregion // terminate previous state and append the next state if it's changed if (nextStateName != prevState.ProgrammingState) { #region append new state // idle state is instantiated with a valid termination date // when idle state is created, it also terminates the previous state (timeout) if (prevState.EndTime == timeTo) { // terminate previous non-idle state prevState.EndTime = currEventTime; prevState.EndPoint = currEventPoint; } var uiproperties = TimelineStateDictionaries.UIProperties[nextStateName]; userData.measures.Add(new State { // new state ProgrammingState = nextStateName, Name = uiproperties.Label, CssClass = grayscale ? uiproperties.CssGray : uiproperties.Css, StartTime = currEventTime, ShiftedStartTime = currEventTime, StartPoint = currEventPoint, EndTime = timeTo, EndPoint = totalMinutes, }); #endregion } else { // update continous state start time so it won't timeout to idle state prevState.ShiftedStartTime = currEventTime; } } } #region append idle state to the end if necessary chartData.ForEach(x => { var lastMeasure = x.measures.Last(); if (lastMeasure.EndTime == timeTo && (timeTo - lastMeasure.ShiftedStartTime).TotalMinutes > timeoutVal) { // prepare a new idle state for the end var uiproperties = TimelineStateDictionaries.UIProperties[ProgrammingState.idle]; var idleState = new State { ProgrammingState = ProgrammingState.idle, Name = uiproperties.Label, CssClass = grayscale ? uiproperties.CssGray : uiproperties.Css, StartTime = lastMeasure.StartTime.AddMinutes(timeoutVal), StartPoint = lastMeasure.StartPoint + timeoutVal, EndTime = lastMeasure.EndTime, EndPoint = lastMeasure.EndPoint, }; x.measures.Add(idleState); // terminate the lastMeasure state lastMeasure.EndTime = idleState.StartTime; lastMeasure.EndPoint = idleState.StartPoint; } else if (lastMeasure.ProgrammingState == ProgrammingState.idle) { lastMeasure.EndTime = timeTo; lastMeasure.EndPoint = totalMinutes; } }); #endregion // only show horizontal x-axis for the last series if (chartData.Count > 0) { chartData.Last().showTicks = true; } return(chartData); } }
/// <summary> /// build a list of qualified error quotient events with error types and documents /// </summary> /// <param name="dateFrom"></param> /// <param name="dateTo"></param> /// <param name="userIds"></param> /// <returns></returns> public static List <BuildErrorEvent> Get(DateTime?dateFrom, DateTime?dateTo, IEnumerable <int> userIds, bool includeErrorFixInfo = false) { using (var context = new OsbideProcs()) { #region filter qualified build error event for the selected users // filter qualified build error event for the selected users var minDate = new DateTime(2000, 1, 1); var events = (from e in context.GetErrorQuotientSessionData((!dateFrom.HasValue || dateFrom.Value < minDate) ? minDate : dateFrom, (!dateTo.HasValue || dateTo.Value < minDate) ? DateTime.Today : dateTo, string.Join(",", userIds)) select new BuildErrorEvent { BuildId = e.BuildId, LogId = e.LogId, UserId = e.SenderId, EventDate = e.EventDate, }).ToList(); #endregion var eventLogIds = string.Join(",", events.Select(e => e.LogId)); // error types for the resultant build error events var errorTypes = GetErrorTypes(context, eventLogIds, includeErrorFixInfo); #region error messages for the resultant build error events // error messages for the resultant build error events var errorMessages = new List <GetBuildErrorMessages_Result>(); if (includeErrorFixInfo) { errorMessages = (from e in context.GetBuildErrorMessages(eventLogIds) select e).ToList(); } #endregion // error documents for the resultant build error events var errorDocs = (from d in context.GetErrorQuotientDocumentData(string.Join(",", events.Select(e => e.BuildId))) select d).ToList(); #region associate error types and documents to the build error events // associate error types and documents to the build error events foreach (var e in events) { // error types var et = errorTypes.Where(t => t.LogId == e.LogId).ToList(); if (et.Count > 0) { e.ErrorTypes = et; } // error messages var em = errorMessages.Where(m => m.LogId == e.LogId).Select(m => m.ErrorMessage).ToList(); if (em.Count > 0) { e.ErrorMessages = em; } // error documents var ed = errorDocs.Where(d => d.BuildId == e.BuildId) .Select(d => new ErrorDocumentInfo { DocumentId = d.DocumentId, Line = d.Line, Column = d.Column, FileName = d.FileName, NumberOfModified = d.NumberOfModified != null && d.NumberOfModified.HasValue ? d.NumberOfModified.Value : 0, ModifiedLines = d.ModifiedLines != null && d.ModifiedLines.Length > 0 ? d.ModifiedLines.Split(',').Select(l => Convert.ToInt32(l)).ToList() : null }) .ToList(); if (ed.Count > 0) { e.Documents = ed; } } #endregion return(events); } }