gpt4 book ai didi

c# - 将来自不同来源的两个 LINQ 查询组合成单个对象

转载 作者:太空狗 更新时间:2023-10-29 23:24:40 25 4
gpt4 key购买 nike

我正在从两个不同的来源收集数据,目的是填充单个对象。我的课是

public class SampleClient
{
public string ClientId { get; set; }
public string JobName { get; set; }
public string JobUrl { get; set; }
public string Version { get; set; }
}

第一个 LINQ 查询填充 SampleClient 对象的集合,获取除 Version 之外的所有值。然后我需要遍历 SampleClient 的集合并在第二个查询中使用 ClientId 值。第二个查询的结果是 Version 值。这是我的第一个 LINQ 查询:

    private void btnProjects_Click(object sender, EventArgs e)
{
string[] stringArray = { "demo", "sample", "test", "training" };
List<SampleClient> jobList =
(
from x in XDocument.Load(XML URL VALUE HERE).Root.Elements("job")
where x.Element("name").Value.Contains("-config") && x.Element("name").Value.StartsWith("oba-")
&& (!stringArray.Any(s => x.Element("name").Value.Contains(s)))
select new SampleClient
{
ClientId = getClientId((string)x.Element("name")),
JobName = (string)x.Element("name"),
JobUrl = (string)x.Element("url"),
}).ToList();

foreach (SampleClient job in jobList)
{
//Display the results in a textbox
txtResults.Text += "Job Name = " + job.JobName + " | Job URL = " + job.JobUrl + " | ";
}
}

在获取版本的查询中,我目前有:

var version = from item in doc.Descendants(ns + "properties")
select new SampleClient
{
ClientId = strClientId,
Version = (string)item.Element(ns + "product.version").Value
};

请务必注意,第二个查询中使用的 URL 源是使用从第一个查询中获取的 ClientId 创建的。我可以有一个例行循环并清理/合并对象,但这感觉就像一个 hack。有没有更简洁的方法来处理这个问题?

这是来自第一个查询的 XML 示例:

<?xml version="1.0"?>
<allView>
<description>PROD</description>
<job>
<name>abc</name>
<url>http://ci-client.company.net/job/abc/</url>
<color>blue</color>
</job>
<job>
<name>acme</name>
<url>http://ci-client.company.net/job/acme/</url>
<color>blue</color>
</job>
</allView>

第二个查询 URL 是使用第一个查询结果中的 clientID 动态创建的。我正在使用它来加载 Maven POM 文件并获取版本信息。这是 POM 文件中的 XML 片段。

<?xml version="1.0" encoding="UTF-8" ?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.company.xyz</groupId>
<artifactId>io</artifactId>
<version>6.11.7-ACME-SNAPSHOT</version>
<packaging>pom</packaging>
<properties>
<product.version>6.11.7</product.version>
<db.version>1.4</db.version>
</properties>
<modules>
<module>policies</module>
<module>templates</module>
<module>assemble</module>
</modules>
</project>

最佳答案

我希望我理解你的问题..

这会将它们合并在一起(尽管我的测试数据只有 ClientId、JobName 和 Version..)。 Query 1 包含 ClientId 和 JobName,Query2 包含 ClientId 和 Version。

IList<SampleClient> mergedList = firstQuery.Concat(secondQuery)
.ToLookup(x => x.ClientId)
.Select(x => x.Aggregate((query1, query2) =>
new SampleClient() {
ClientId = query1.ClientId,
JobName = query1.JobName,
Version = query2.Version
}
)
).ToList();

..可能不如您的手动方法有效..但是我没有什么可作为基准的..

关于c# - 将来自不同来源的两个 LINQ 查询组合成单个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13338040/

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