Сбой сервера при выполнении Linq.ФильтрБиГрид в Asp.net Linq

#c# #asp.net #linq #linq-to-sql

Вопрос:

Привет, часто мой сервер выходит из строя, и во время анализа я нашел ниже код, в котором он выходит из строя. В дампе, похоже, регрессия и сбой были вызваны I2.Web.dll!I2.Web.Linq.ФильтрБиГридПоле определения протоколаgt;(System.Linq.Я требуюПоле управления протоколомgt; источник, I2.Web.Элементы управления.Сетка сетка) Строка 58 Исключение C# — это поток, израсходовавший свой стек . Этот метод filterByGrid используется везде в приложении, но возникает проблема только для этого источника. Пожалуйста, помогите мне. заранее спасибо

 return DB.ProtocolDeviationSites  .Where(x =gt; x.ProtocolSiteId == EntityId)  .Select(x =gt; new BrowserData  {  Id = x.Id,  ProtocolDeviationId = x.ProtocolDeviationId,  Category = x.ProtocolDeviation.ProtocolDeviationCategory.Name,  Status = x.ProtocolDeviation.Status,  DateOccured = x.ProtocolDeviation.DateOccured,  DateReported = x.ProtocolDeviation.DateReported,  FollowUpRequired = x.ProtocolDeviation.FollowUpRequired,  FollowUpDueDate = x.FollowUpDueDate,  FollowUpCloseDate = x.FollowUpCloseDate,  PINotified = x.PINotified,  AssignedTo = x.AssignedTo,  EntityId = x.EntityId,  RecordStatus = x.RecordStatus,  DateModified = x.DateModified  }).FilterByGrid(GridMain);  

Также вы можете проверить приведенный ниже метод

 var protocols = from p in DB.FilteredProtocols  join org in  (from po in DB.ProtocolOrgs  join go in DB.GlobalOrgs on po.GlobalOrg equals go  where po.EntityId == 0 amp;amp; po.RecordStatus == 0 amp;amp; go.EntityId == 0 amp;amp; go.RecordStatus == 0  where go.OrganizationType == OrganizationType.Sponsor.ToString()  select new {po.ProtocolId, go.OrganizationName}) on (GridMain.InHistory ? p.EntityId : p.Id)  equals org.ProtocolId  into prots  from r in prots.DefaultIfEmpty()  where p.Name != "infolink"  where (from ps in DB.ProtocolSites  where ps.GlobalSiteId == EntityId amp;amp; ps.EntityId == 0 amp;amp; ps.RecordStatus == 0  select ps.ProtocolId).Contains(p.Id)  select new BrowserData  {  Id = p.Id,  RecordStatus = p.RecordStatus,  EntityId = p.EntityId,  DateModified = p.DateModified,  FcoCode = p.FcoCode,  OrganizationName = r != null ? r.OrganizationName : null,  Name = p.Name,  ProtocolPhase = p.ProtocolPhase,  ProtocolStatus = p.ProtocolStatus  };  return protocols.FilterByGrid(GridMain);//This is line number 58  

Это метод FilterByGrid

 public static IQueryablelt;Tgt; FilterByGridlt;Tgt;(this IQueryablelt;Tgt; source, Grid grid)  {  if (source == null) return null;  var result = source.Where(GetEntityExpressionlt;Tgt;(grid)); //We're not double fetching here, remember LinqToSQL is a deferred execution model and nothing actually happens yet...   if (!grid.InHistory)  {  switch (grid.RecStatus)  {  case RecordStatus.All:  break;  case RecordStatus.Active:  if ((grid.Title != null) amp;amp; ( grid.Title.Equals("Site Contact List") || grid.Title.Equals("Principal Investigator List")))  {  var resultA = result.Where(GetRecordStatusExpressionlt;Tgt;((int)RecordStatus.Active));  var resultIa = result.Where(GetRecordStatusExpressionlt;Tgt;((int)RecordStatus.Inactive));  result = resultA.Union(resultIa);  break;  }  else  {  result = result.Where(GetRecordStatusExpressionlt;Tgt;((int)grid.RecStatus));  }  break;  case RecordStatus.Inactive:  case RecordStatus.Deleted:  result = result.Where(GetRecordStatusExpressionlt;Tgt;((int)grid.RecStatus));  break;  default:  result = result.Where(GetRecordStatusExpressionlt;Tgt;((int)RecordStatus.Active));  break;  }  var se = GetGridSearchExpressionlt;Tgt;(grid);  if (se != null) result = result.Where(se);  if (grid.SortExpression.HasValue())  result = result.SetGridOrderBy(grid);  }  var qs = result.ToList();  if (grid.InHistory)  {  string historyQuery = DataContext.Current.GetCommand(result).ChangeSchemaAndInsertParams(typeof(IHistoryable).IsAssignableFrom(typeof(T)));   var histResult = DataContext.Current.ExecuteQuerylt;Tgt;(historyQuery, new object[] { });  return histResult.AsQueryable();  }  else  {  var rs = qs.AsQueryable();  return rs;  }  }  

Комментарии:

1. Не видя кода и ФАКТИЧЕСКОГО сообщения об исключении, это предположение, но я думаю, что это исключение с нулевой ссылкой.

2. Исключением является поток, израсходовавший свой стек

3. Ты имеешь в виду а StackOverflowException ? Использование правильной терминологии очень важно при обращении за помощью. Как насчет публикации Linq, который генерирует это исключение?

4. Я обновил код

5. Это FilterByGrid пакет nuget или что-то, написанное внутри? Я ничего не могу сказать об этом в Интернете.