5

1つのオブジェクトにデータを入力することを目的として、2つの異なるソースからデータを収集しています。私のクラスは

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バージョンを除くすべての値を取得するオブジェクトのコレクションにデータを入力します。次に、2番目のクエリで値のコレクションをループしてSampleClient利用する必要があります。ClientId2番目のクエリの結果はバージョン値です。これが私の最初の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
};

2番目のクエリで使用されるURLソースは、最初のクエリから取得されたものを使用して作成されることに注意してくださいClientId。オブジェクトを定期的にループしてクリーンアップ/マージすることもできますが、これはハックのように感じます。これを処理するためのよりクリーンな方法はありますか?

これは、最初のクエリからの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>

2番目のクエリ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>
4

2 に答える 2

3

私はあなたの質問を理解することを望みます。

これにより、それらがマージされます(ただし、私のテストデータにはClientId、JobName、およびVersionのみが含まれていました)。クエリ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();

..おそらく手動の方法ほど効率的ではありません..しかし、私はベンチマークするものが何もありません..

于 2012-11-12T04:07:58.017 に答える
1

これを試して:

var jobList = from x in XDocument.Load(...
              where ...
              let clientId = getClientId((string)x.Element("name"))
              select new SampleClient
              {
                  ClientId = clientId,
                  JobName = (string)x.Element("name"),
                  JobUrl = (string)x.Element("url"),
                  Version = (string)XDocument
                      .Load(GetSecondQueryUrl(clientId))
                      .Root
                      .Element(pom4 + "properties")
                      .Element(pom4 + "product.version")
              };
于 2012-11-12T04:19:20.703 に答える