2

C#を使用してContractIDが2である次のxmlファイルから最後の1ステータスを選択するにはどうすればよいですか?

<actions>
     <Action>
    <ID>2</ID>
    <ContractID>1</ContractID>
    <EmployeeID>1</EmployeeID>
    <Date>2012-09-04 00:00:00.000</Date>
    <Reply/>
    <Status>4002</Status>
</Action>
    <Action>
    <ID>2</ID>
    <ContractID>2</ContractID>
    <EmployeeID>1</EmployeeID>
    <Date>2012-09-04 00:00:00.000</Date>
    <Reply/>
    <Status>4005</Status>
</Action>
    <Action>
    <ID>2</ID>
    <ContractID>2</ContractID>
    <EmployeeID>1</EmployeeID>
    <Date>2012-09-04 00:00:00.000</Date>
    <Reply/>
    <Status>4008</Status>
</Action>
</actions>

linqtoxmlまたはその他の方法を使用して上位nを選択する方法


そして、次のSQLクエリに相当するlinqtoxmlコードは何ですか。

Select contracts.ID, contracts.ContractNo, 
    (select FieldName from tbl_SysType where ID =
    (select top 1 status from tbl_EmployeesActions where ContractID=contracts.ID and Status is not null order by ID desc ))as ContractStatus
from tbl_Contracts as contracts

以下のようにContracts.xml、SysType.xml、およびEmployeesActions.xmlという名前のxmlファイルがある場合Contracts.xml

<Contracts>
     <Contract>
    <ID>1</ID>
    <ContractNo>Mob124444</ContractNo>      
</Contract>
    <Contract>
    <ID>2</ID>
    <ContractNo>Mob124445</ContractNo>      
</Contract>
</Contracts>

EmployeesActions.xml

    <actions>
     <Action>
    <ID>2</ID>
    <ContractID>1</ContractID>
    <EmployeeID>1</EmployeeID>
    <Date>2012-09-04 00:00:00.000</Date>
    <Reply/>
    <Status>4002</Status>
</Action>
    <Action>
    <ID>2</ID>
    <ContractID>2</ContractID>
    <EmployeeID>1</EmployeeID>
    <Date>2012-09-04 00:00:00.000</Date>
    <Reply/>
    <Status>4005</Status>
</Action>
    <Action>
    <ID>2</ID>
    <ContractID>2</ContractID>
    <EmployeeID>1</EmployeeID>
    <Date>2012-09-04 00:00:00.000</Date>
    <Reply/>
    <Status>4008</Status>
</Action>
</actions>

Systype.xml

<SysTypes>
    <systype>
        <ID>4002</ID>
        <FieldName>New</FieldName>
    </systype>
<systype>
        <ID>4005</ID>
        <FieldName>Opened</FieldName>
    </systype>
<systype>
        <ID>4008</ID>
        <FieldName>Closed</FieldName>
    </systype>
</SysTypes>
4

2 に答える 2

5

両方の要件のコードスニペットは次のとおりです。

XDocument doc = XDocument.Load(@"XMLFile.xml");

var statuses = doc.Descendants("Action")
                  .Where(s => s.Element("ContractID").Value.Equals("2"))
                  .Select(s => s.Element("Status").Value);

ContractIDが2である最後のステータスを選択します

var lastStatus = statuses.Last();

ContractIDが2である上位Nステータスを選択します

int N = 2; // assuming TOP 2
var topNStatuses = statuses.Take(N);

新しい要件については、SQLクエリの代わりに次のコードスニペットを使用できます。

XDocument employees = XDocument.Load(@"EmployeesActions.xml");
XDocument contracts = XDocument.Load(@"Contracts.xml");
XDocument sysTypes = XDocument.Load(@"Systype.xml");

var result = employees.Descendants("Action")
            .Join(sysTypes.Descendants("systype"),
                e => e.Element("Status") != null ? e.Element("Status").Value : "",
                s => s.Element("ID").Value,
                (e, s) => new
                {
                    ID = e.Element("ID").Value,
                    ContractID = e.Element("ContractID").Value,
                    Status = s.Element("FieldName").Value
                })
            .Where(x => !String.IsNullOrEmpty(x.Status))
            .OrderByDescending(x => x.ID)
            .Take(1)
            .Join(contracts.Descendants("Contract"),
                e => e.ContractID,
                c => c.Element("ID").Value,
                (e, c) => new
                {
                    ContractID = c.Element("ID").Value,
                    ContractNo = c.Element("ContractNo").Value,
                    Status = e.Status
                });
于 2012-11-11T08:55:21.833 に答える
4
var result = XElement.Load("data.xml").
                      Descendants("Action").
                      Where(x => x.Element("ContractID").Value == "2")
                      .Select(y => new
                       {
                            id = y.Element("ID").Value,
                            empId = y.Element("EmployeeID").Value,
                            contractId = y.Element("ContractID").Value,
                            date = y.Element("Date").Value
                       });

トップN(1)を選ぶには

var top = result.Take(1);

最後のN(1)を選択するには

var last = result.Skip(result.Count()-1);
于 2012-11-11T08:58:47.617 に答える