Xml 根据数据库表创建时出错:.Net Core 3.1 内存泄漏
Error in Xml Creation from as per Database tables : .Net Core 3.1 Memory Leak
我正在设置一种获取 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(重新编辑)
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();
已经知道这是重复的问题,但是我在这里做错了什么编码。请指导我。
在将实体投影到 XML 之前只需 select 个实体。这就是 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 查询和 returns 可以使用结果的 IEnumerable。
第二行将查询结果枚举为orderTemplate
对象并将它们投射到XElements中并复制到一个List中。
我正在设置一种获取 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(重新编辑)
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();
已经知道这是重复的问题,但是我在这里做错了什么编码。请指导我。
在将实体投影到 XML 之前只需 select 个实体。这就是 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 查询和 returns 可以使用结果的 IEnumerable。
第二行将查询结果枚举为orderTemplate
对象并将它们投射到XElements中并复制到一个List中。