C# 在应用程序中使用C在linq to xml表达式中动态设置字段
我正在尝试使用XElement从数据库表导出XML文件。我首先使用的是EF6.0代码 我正在通过下面的代码使用XElement准备XMLC# 在应用程序中使用C在linq to xml表达式中动态设置字段,c#,xml,linq,entity-framework,razor,C#,Xml,Linq,Entity Framework,Razor,我正在尝试使用XElement从数据库表导出XML文件。我首先使用的是EF6.0代码 我正在通过下面的代码使用XElement准备XML TooltypeXml = new XElement("ToolTypes", (from tbl in db.ToolType where tbl.CreationDate >= objLastSyncByDevice.LocaltoServerLastAc
TooltypeXml =
new XElement("ToolTypes",
(from tbl in db.ToolType
where tbl.CreationDate >= objLastSyncByDevice.LocaltoServerLastAccessDate
|| tbl.LastModifieDate >= objLastSyncByDevice.LocaltoServerLastAccessDate
|| tbl.IsDeleted == true
select new
{
tbl.ToolTypeId,
tbl.ToolTypeName,
tbl.Action,
tbl.UpdatedBy,
tbl.CreationDate,
tbl.CreatedBy,
tbl.LastModifieDate,
tbl.IsDeleted
}).ToList()
.Select(x =>
new XElement("ToolType",
new XElement("ToolTypeName", x.ToolTypeName),
new XElement("Action", x.Action),
new XElement("UpdatedBy", x.UpdatedBy),
new XElement("CreationDate", x.CreationDate),
new XElement("CreatedBy", x.CreatedBy),
new XElement("LastModifieDate", x.LastModifieDate),
new XElement("IsDeleted", x.IsDeleted))));
所以它确实成功地创建了XML格式,我想要的是如何编写Linq表达式,这样我就不需要指定表达式中要选择的每个字段。因为我总是需要表中的所有字段,如果我确实更改了表中的某些内容,我就不需要更改代码中的任何内容。请帮忙。提前谢谢 我找到了这个问题的解决方案, 我添加了以下代码来获取类的所有属性,并将每个字段创建为XElement
private void CreateXElemetsOfClass(System.Type typeOfClass, string TableName, dynamic objData, string p_mainElementName, string MachineID)
{
try
{
if (objData != null && objData.Count > 0)
{
System.Reflection.PropertyInfo[] properties = typeOfClass.GetProperties();
List<XElement> lstXElements = new List<XElement>();
List<XElement> lstmainElements = new List<XElement>();
XElement rootElement = new XElement(TableName);
foreach (var item in objData)
{
lstXElements = new List<XElement>();
XElement mainElement = new XElement(p_mainElementName);
foreach (System.Reflection.PropertyInfo property in properties)
{
var notMapped = property.GetCustomAttributes(typeof(NotMappedAttribute), false);
if (notMapped.Length == 0)
{
lstXElements.Add(new XElement(property.Name, property.GetValue(item, null)));
}
}
mainElement.Add(lstXElements);
lstmainElements.Add(mainElement);
}
rootElement.Add(lstmainElements);
string XMLFilePath = serializetoxmlNew(rootElement, MachineID, TableName);
}
}
catch (Exception ex)
{
throw;
}
}
希望这对你有帮助!它工作得很好。看起来您最好将对象序列化为XML,而不要创建自定义序列化函数。是的,我已经使用了序列化,但它实际上并没有创建一个模型类的所有属性标记,它正在创建用于多对多关系的虚拟属性的问题。所以我必须明确地使用这个。
<?xml version="1.0" encoding="utf-8"?>
<FileTypes>
<FileType>
<FileTypeId>1b254bc3-7516-4f9c-89ea-d9b20ecbf005</FileTypeId>
<Description>Excel</Description>
<CreatedBy>22a8be24-9272-4d7e-9248-e9064f917884</CreatedBy>
<UpdatedBy>22a8be24-9272-4d7e-9248-e9064f917884</UpdatedBy>
<CreateDate>2014-08-22T16:05:53.177</CreateDate>
<UpdateDate>2014-08-22T16:05:53.177</UpdateDate>
<FileExtension>.xls</FileExtension>
<FileTypeImage>excel.png</FileTypeImage>
<Action>Create</Action>
<IsDeleted>false</IsDeleted>
</FileType>
<FileType>
<FileTypeId>f3362487-d96e-4cc8-bc4b-5120866f95ce</FileTypeId>
<Description>Adobe Acrobat Reader</Description>
<CreatedBy>22a8be24-9272-4d7e-9248-e9064f917884</CreatedBy>
<UpdatedBy>22a8be24-9272-4d7e-9248-e9064f917884</UpdatedBy>
<CreateDate>2014-08-22T16:05:12.407</CreateDate>
<UpdateDate>2014-08-22T16:05:12.407</UpdateDate>
<FileExtension>.pdf</FileExtension>
<FileTypeImage>pdf.png</FileTypeImage>
<Action>Create</Action>
<IsDeleted>false</IsDeleted>
</FileType>
</FileTypes>