Morelinq ExceptBy使用了几个特定的​​元素

时间:2015-05-10 08:27:46

标签: c# xml linq .net-3.5 morelinq

有2个xml文件

第一个xml文件包含:

<Prices>
    <Price>
        <SalesOrg>700</SalesOrg>
        <AreaOfPricing>D20</AreaOfPricing>
        <ProductId>20228090</ProductId>
        <EffectiveDate>2015-05-11T00:00:00+7</EffectiveDate>
        <DistributorPriceFibrate>200</DistributorPriceFibrate>
        <CustomerPriceFibrate>20</CustomerPriceFibrate>
        <CustomerPriceInDozen>30</CustomerPriceInDozen>
        <CustomerPriceinPC>80.00</CustomerPriceinPC>
        <CompanyID>001</CompanyID>
        <ValidTo>2999-12-31T00:00:00+7</ValidTo>
        <UOM>CS</UOM>
        <Currency>IDR</Currency>
    </Price>
<Price>
        <SalesOrg>700</SalesOrg>
        <AreaOfPricing>D20</AreaOfPricing>
        <ProductId>20228090</ProductId>
        <EffectiveDate>2015-05-11T00:00:00+7</EffectiveDate>
        <DistributorPriceFibrate>200</DistributorPriceFibrate>
        <CustomerPriceFibrate>20</CustomerPriceFibrate>
        <CustomerPriceInDozen>30</CustomerPriceInDozen>
        <CustomerPriceinPC>80.00</CustomerPriceinPC>
        <CompanyID>001</CompanyID>
        <ValidTo>2999-12-31T00:00:00+7</ValidTo>
        <UOM>CS</UOM>
        <Currency>IDR</Currency>
    </Price>
<Price>
        <SalesOrg>700</SalesOrg>
        <AreaOfPricing>D20</AreaOfPricing>
        <ProductId>20228090</ProductId>
        <EffectiveDate>2015-05-11T00:00:00+7</EffectiveDate>
        <DistributorPriceFibrate>180</DistributorPriceFibrate>
        <CustomerPriceFibrate>20</CustomerPriceFibrate>
        <CustomerPriceInDozen>30</CustomerPriceInDozen>
        <CustomerPriceinPC>80.00</CustomerPriceinPC>
        <CompanyID>001</CompanyID>
        <ValidTo>2999-12-31T00:00:00+7</ValidTo>
        <UOM>CS</UOM>
        <Currency>IDR</Currency>
    </Price>
</Prices>

和第二个xml文件:

<Prices>
    <Price>
        <SalesOrg>700</SalesOrg>
        <AreaOfPricing>D20</AreaOfPricing>
        <ProductId>20228090</ProductId>
        <EffectiveDate>2015-05-11T00:00:00+7</EffectiveDate>
        <DistributorPriceFibrate>200</DistributorPriceFibrate>
        <CustomerPriceFibrate>20</CustomerPriceFibrate>
        <CustomerPriceInDozen>30</CustomerPriceInDozen>
        <CustomerPriceinPC>80.00</CustomerPriceinPC>
        <CompanyID>001</CompanyID>
        <ValidTo>2999-12-31T00:00:00+7</ValidTo>
        <UOM>CS</UOM>
        <Currency>IDR</Currency>
    </Price>
</Prices>

我想要的是,使用morelinq功能ExceptBy(),或使用自定义类扩展IEqualityComparer on Linq中的Except()功能返回类似的东西(在第一个xml文件和第二个xml文件之间,即使是第三个第一个xml文件上的标记价格具有不同的DistributorPriceFibrate值:

<Prices/>

由于Except()比较了元素'Price'节点上的所有值,我只想比较<ProductId><EffectiveDate>处的特定元素。

如果它们相同,则转到空标记<Prices/>。如果这些元素的值不相同,则从第一个xml文件中返回价格标签,该文件与第二个xml文件中的值ProductIDEffectiveDate不同。

我做了什么我区分了第一个xml文件:

var distinctItemsonxmldoc1 =
                xmldoc1
                .Descendants("Price")
                .DistinctBy(element => new
                {
                    ProductId = (string)element.Element("ProductId"),
                    EffectiveDate = (string)element.Element("EffectiveDate")
                });
var afterdistinctxmldoc1 = new XElement("Prices");
            foreach (var a in distinctItemsonxmldoc1 )
            {
                afterdistinctxmldoc1.Add(a);
            }

和使用时除了比较两个文件之外:

var afterexcept = afterdistinctxmldoc1.Descendants("Price").Cast<XNode>().Except(xmldoc2.Descendants("Price").Cast<XNode>(), new XNodeEqualityComparer());

但它比较价格节点上的所有元素值。 如何在spesific元素中使用ExceptBy()? 或自定义IComparer可能?

先谢谢。

EDIT
已经解决了。 see the answer by @dbc

1 个答案:

答案 0 :(得分:2)

确认我理解您的问题:给定两个XML文档,您希望枚举第一个文档中每个Price元素的实例,其中 distinct 值为子元素值{{ 1}}和ProductId,使用MoreLinq跳过EffectiveDateProductId与第二个文档中的EffectiveDate元素匹配的所有人。

在这种情况下,你可以这样做:

Price