Ошибка при создании Xml из таблиц базы данных:. Net Утечка памяти Core 3.1 - PullRequest
1 голос
/ 16 июня 2020

Я настраиваю метод для получения данных Xml, данные которых берутся из таблиц базы данных. Вышеупомянутые функции работали до обновления проекта .Net Core2.1 до .Net Core 3.1.1. Этот код ниже показывает ошибку.

Template.cs

 orderTemplate =
                  (from ordt in _context.OrderTemplates
                   where ordt.Id == orderTempId // int orderTempId=1;
                   select new XElement("OrderTemplate",
                          new XElement("OrderTemplateId", ordt.Id),
                          new XElement("OrderTemplateName", ordt.Name),
                          new XElement("OrderTemplateDescription", ordt.Description)));

Исключение

Client projection contains reference to constant expression of 'System.Xml.Linq.XName'. 
This could potentially cause memory leak. Consider assigning this constant to local variable 
and using the variable in the query instead. See https://go.microsoft.com/fwlink/?linkid=2103067 for more information.

XML Формат данных :( Ожидаемый результат)

<OrderTemplate>
  <OrderTemplateId>1</OrderTemplateId>
  <OrderTemplateName>BBCSeat</OrderTemplateName>
  <OrderTemplateDescription>Boeing Business Class Seat</OrderTemplateDescription>
</OrderTemplate>

Template.cs (Rediited)

 orderTemplate =
                  (from ordt in _context.OrderTemplates
                   where ordt.Id == orderTemplateId
                  select new {
                  _OrderTemplate = ordt,
                 _OperationTemplates =(from ot in _context.OrderTemplates                                                
                                       join opt in _context.OperationTemplates 
                                     on ot.Id equals opt.OrderTemplateId into ps1                                               
                                    from opt in ps1.DefaultIfEmpty()
                                    join asm in _context.AssemblyUnits
                                    on opt.AssemblyUnitId equals asm.Id into ps5
                                   from asm in ps5.DefaultIfEmpty()
                                    where ot.Id == ordt.Id
                                      orderby opt.OrderBy ascending
                                      select new
                                                {
                                                    _OperationTemplate =  opt,
                                                    _Assembly =  asm,
})}).AsEnumerable();

Уже знаю, что это повторяющийся вопрос, но какое неправильное кодирование я делаю Вот. Пожалуйста, направьте меня.

1 Ответ

1 голос
/ 16 июня 2020

Просто выберите объекты перед их проецированием в XML. В любом случае это то, что сделал EF Core 2.1.

 var orderTemplates =_context.OrderTemplates.Where(ordt=> ordt.Id == orderTempId).AsEnumerable();

 var orderTemplate =
                  (from ordt in orderTemplates 
                   select new XElement("OrderTemplate",
                          new XElement("OrderTemplateId", ordt.Id),
                          new XElement("OrderTemplateName", ordt.Name),
                          new XElement("OrderTemplateDescription", ordt.Description))).ToList();

Концептуально первая строка кода строит запрос, преобразует его в SQL, выполняет запрос SQL и возвращает IEnumerable, который может использовать результаты.

Вторая строка перечисляет результаты запроса как orderTemplate объекты, проецирует их в XElements и копирует их в список.

...