Morelinq ExceptBy 使用几个特定元素
Morelinq ExceptBy using several specific element
有 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()
,或使用自定义 class 将 Linq 中 Except() 功能上的 IEqualityComparer 扩展到 return 类似这样的东西(在第一个 xml 文件和第二个 xml 文件,即使第一个 xml 文件的第三个标签价格具有不同的 DistributorPriceFibrate
值):
<Prices/>
由于 Except()
比较元素 'Price' 节点上的所有值,我只想比较 <ProductId>
和 <EffectiveDate>
处的特定元素。
如果相同,则去空标签<Prices/>
。如果这些元素的值不同,return 第一个 xml 文件的价格标签与第二个 xml 文件的 ProductID
和 EffectiveDate
的值不同。
我所做的我区分了第一个 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);
}
并且在使用 except 比较 2 个文件时:
var afterexcept = afterdistinctxmldoc1.Descendants("Price").Cast<XNode>().Except(xmldoc2.Descendants("Price").Cast<XNode>(), new XNodeEqualityComparer());
但它比较价格节点上的所有元素值。
如何在特定元素中使用 ExceptBy()?
或者自定义 IComparer?
之前谢谢你。
编辑
已经解决了。 .
为了确认我理解您的问题:给定两个 XML 文档,您想要使用 distinct[=24= 枚举第一个文档中每个 Price
元素的实例] 为子元素 ProductId
和 EffectiveDate
赋值,跳过所有 ProductId
和 EffectiveDate
与第二个文档中的 Price
元素匹配的元素,使用 MoreLinq
.
在这种情况下,您可以这样做:
var diff = xmldoc1.Descendants("Price").ExceptBy(xmldoc2.Descendants("Price"),
e => new { ProductId = e.Elements("ProductId").Select(p => p.Value).FirstOrDefault(), EffectiveDate = e.Elements("EffectiveDate").Select(p => p.Value).FirstOrDefault() });
有 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()
,或使用自定义 class 将 Linq 中 Except() 功能上的 IEqualityComparer 扩展到 return 类似这样的东西(在第一个 xml 文件和第二个 xml 文件,即使第一个 xml 文件的第三个标签价格具有不同的 DistributorPriceFibrate
值):
<Prices/>
由于 Except()
比较元素 'Price' 节点上的所有值,我只想比较 <ProductId>
和 <EffectiveDate>
处的特定元素。
如果相同,则去空标签<Prices/>
。如果这些元素的值不同,return 第一个 xml 文件的价格标签与第二个 xml 文件的 ProductID
和 EffectiveDate
的值不同。
我所做的我区分了第一个 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);
}
并且在使用 except 比较 2 个文件时:
var afterexcept = afterdistinctxmldoc1.Descendants("Price").Cast<XNode>().Except(xmldoc2.Descendants("Price").Cast<XNode>(), new XNodeEqualityComparer());
但它比较价格节点上的所有元素值。 如何在特定元素中使用 ExceptBy()? 或者自定义 IComparer?
之前谢谢你。
编辑
已经解决了。
为了确认我理解您的问题:给定两个 XML 文档,您想要使用 distinct[=24= 枚举第一个文档中每个 Price
元素的实例] 为子元素 ProductId
和 EffectiveDate
赋值,跳过所有 ProductId
和 EffectiveDate
与第二个文档中的 Price
元素匹配的元素,使用 MoreLinq
.
在这种情况下,您可以这样做:
var diff = xmldoc1.Descendants("Price").ExceptBy(xmldoc2.Descendants("Price"),
e => new { ProductId = e.Elements("ProductId").Select(p => p.Value).FirstOrDefault(), EffectiveDate = e.Elements("EffectiveDate").Select(p => p.Value).FirstOrDefault() });