C# 在应用程序中使用C在linq to xml表达式中动态设置字段

C# 在应用程序中使用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

我正在尝试使用XElement从数据库表导出XML文件。我首先使用的是EF6.0代码

我正在通过下面的代码使用XElement准备XML

 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>