gpt4 book ai didi

c# - 如何通过 Linq-to-XML 使用数据更新现有实体?

转载 作者:太空宇宙 更新时间:2023-11-03 14:14:54 25 4
gpt4 key购买 nike

我正在使用 Linq-to-Xml 读取 XML 并更新现有数据结构。现在我有以下代码来执行此操作:

        // Load all the test plan details
var details = doc.Descendants()
.Select(x => new
{
Name = x.Attribute("name").ToStringValue(),
DbName = x.Attribute(DATABASE_ATTR).ToStringValue(),
Login = x.Attribute(USERNAME_ATTR).ToStringValue(),
Password = x.Attribute(PASSWORD_ATTR).ToStringValue(),
AppSource = x.Attribute(APPSOURCE_ATTR).ToStringValue()
})
.First();


testPlan.Name = details.Name;
testPlan.DatabaseName = details.DbName;
testPlan.LoginUsername = details.Login;
testPlan.LoginPassword = details.Password;
testPlan.ApplicationSource = details.AppSource;
}

这对我来说有点烦人,因为我必须创建一个临时变量并执行数据传输。有什么方法可以让我直接从 Linq 语句中更新 testPlan 变量,这样可以减少一步吗?我无法通过将更新代码添加到 .Select() 语句来让它工作。

最佳答案

以下应该有效:

doc.Descendants().First()
.Select(x =>
{
testPlan.Name= x.Attribute("name").ToStringValue();
testPlan.DatabaseName = x.Attribute(DATABASE_ATTR)
.ToStringValue();
testPlan.LoginUsername = x.Attribute(USERNAME_ATTR)
.ToStringValue();
testPlan.LoginPassword = x.Attribute(PASSWORD_ATTR)
.ToStringValue();
testPlan.ApplicationSource = x.Attribute(APPSOURCE_ATTR)
.ToStringValue();
return testPlan;
})
.ToList();

中间对First 的调用是为了确保只有第一个后代的属性会被分配给testPlan 的属性。最后的ToList是用来真正执行Select里面的代码的。

虽然这有效,但我不建议使用它,因为它以一种并非为之创建的方式使用 LINQ。此外,很容易创建错误:

  • 如果您忘记了 First,testPlan 将在您的 XML 中包含 last 元素的属性值,因为对每个元素执行选择代码并覆盖属性.
  • 如果您忘记调用 ToList 或强制执行的类似方法,则永远不会执行 Select 中的代码。

所以,基本上,问题是,您创造了很多引入错误的可能性。

我会通过以下方式实现类似的东西:

var x = doc.Descendants.First();
testPlan.Name= x.Attribute("name").ToStringValue();
testPlan.DatabaseName = x.Attribute(DATABASE_ATTR).ToStringValue();
testPlan.LoginUsername = x.Attribute(USERNAME_ATTR).ToStringValue();
testPlan.LoginPassword = x.Attribute(PASSWORD_ATTR).ToStringValue();
testPlan.ApplicationSource = x.Attribute(APPSOURCE_ATTR).ToStringValue();

它更短、更易于阅读,并且不违反 LINQ 来做它不是为之创建的事情。

关于c# - 如何通过 Linq-to-XML 使用数据更新现有实体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6817376/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com