C# C Linq在子查询上获取子查询

C# C Linq在子查询上获取子查询,c#,linq,C#,Linq,在过去的几个小时里,我一直在桌面上敲打脑袋,试图破解这个问题 我尝试使用Linq查询XML文件,XML的格式如下: <MRLGroups> <MRLGroup> <MarketID>6084</MarketID> <MarketName>European Union</MarketName> <ActiveIngredientID>28307</ActiveIngredientID&

在过去的几个小时里,我一直在桌面上敲打脑袋,试图破解这个问题

我尝试使用Linq查询XML文件,XML的格式如下:

<MRLGroups>
<MRLGroup>
    <MarketID>6084</MarketID>
    <MarketName>European Union</MarketName>
    <ActiveIngredientID>28307</ActiveIngredientID>
    <ActiveIngredientName>2,4-DB</ActiveIngredientName>
    <IndexCommodityID>59916</IndexCommodityID>
    <IndexCommodityName>Cucumber</IndexCommodityName>
    <ScientificName>Cucumis sativus</ScientificName>
    <MRLs>
        <MRL>
            <PublishedCommodityID>60625</PublishedCommodityID>
            <PublishedCommodityName>Cucumbers</PublishedCommodityName>
            <MRLTypeID>238</MRLTypeID>
            <MRLTypeName>General</MRLTypeName>
            <DeferredToMarketID>6084</DeferredToMarketID>
            <DeferredToMarketName>European Union</DeferredToMarketName>
            <UndefinedCommodityLinkInd>false</UndefinedCommodityLinkInd>
            <MRLValueInPPM>0.0100</MRLValueInPPM>
            <ResidueDefinition>2,4-DB</ResidueDefinition>
            <AdditionalRegulationNotes>Comments.</AdditionalRegulationNotes>
            <ExpiryDate xsi:nil="true" />
            <PrimaryInd>true</PrimaryInd>
            <ExemptInd>false</ExemptInd>
        </MRL>
        <MRL>
            <PublishedCommodityID>60626</PublishedCommodityID>
            <PublishedCommodityName>Gherkins</PublishedCommodityName>
            <MRLTypeID>238</MRLTypeID>
            <MRLTypeName>General</MRLTypeName>
            <DeferredToMarketID>6084</DeferredToMarketID>
            <DeferredToMarketName>European Union</DeferredToMarketName>
            <UndefinedCommodityLinkInd>false</UndefinedCommodityLinkInd>
            <MRLValueInPPM>0.0100</MRLValueInPPM>
            <ResidueDefinition>2,4-DB</ResidueDefinition>
            <AdditionalRegulationNotes>More Comments.</AdditionalRegulationNotes>
            <ExpiryDate xsi:nil="true" />
            <PrimaryInd>false</PrimaryInd>
            <ExemptInd>false</ExemptInd>
        </MRL>
    </MRLs>
</MRLGroup>
到目前为止,我已经为文件的MRLGroup部分创建了类

 var queryMarket = from market in doc.Descendants("MRLGroup")
                          select new xMarketID
                          {
                              MarketID = Convert.ToString(market.Element("MarketID").Value),
                              MarketName = Convert.ToString(market.Element("MarketName").Value)
                          };
        List<xMarketID> markets = queryMarket.Distinct().ToList();

        var queryIngredient = from ingredient in doc.Descendants("MRLGroup")
                              select new xActiveIngredients
                              {
                                  ActiveIngredientID = Convert.ToString(ingredient.Element("ActiveIngredientID").Value),
                                  ActiveIngredientName = Convert.ToString(ingredient.Element("ActiveIngredientName").Value)
                              };
        List<xActiveIngredients> ingredientes = queryIngredient.Distinct().ToList();

        var queryCommodities = from commodity in doc.Descendants("MRLGroup")
                               select new xCommodities {
                                   IndexCommodityID = Convert.ToString(commodity.Element("IndexCommodityID").Value),
                                   IndexCommodityName = Convert.ToString(commodity.Element("IndexCommodityName").Value),
                                   ScientificName = Convert.ToString(commodity.Element("ScientificName").Value)
                               };
        List<xCommodities> commodities = queryCommodities.Distinct().ToList();
在我得到目录后,我试图根据目录查询文档,以获得某种类型的组,在所有这些之后,我将把这些数据发送到数据库,这里的问题是xml文件每个大约为600MB,我每天都会得到,因此,我的方法是创建目录,只需将MRL发送到连接到包含目录ID的头表的数据库,以下是我迄今为止所做的工作,但失败惨重:

 //markets
        foreach (xMarketID market in markets) {
            //ingredients
            foreach (xActiveIngredients ingredient in ingredientes) {
                //commodities
                foreach (xCommodities commodity in commodities) {
                    var mrls = from m in doc.Descendants("MRLGroup")
                               where Convert.ToString(m.Element("MarketID").Value) == market.MarketID
                               && Convert.ToString(m.Element("ActiveIngredientID").Value) == ingredient.ActiveIngredientID
                               && Convert.ToString(m.Element("IndexCommodityID").Value) == commodity.IndexCommodityID
                               select new
                               {
                                   ms = new List<xMRLIndividial>(from a in m.Element("MRLs").Descendants()
                                                                 select new xMRLIndividial{
                                                                     publishedCommodityID = string.IsNullOrEmpty(a.Element("PublishedCommodityID").Value) ? "" : a.Element("PublishedCommodityID").Value,
                                                                     publishedCommodityName = a.Element("PublishedCommodityName").Value,
                                                                     mrlTypeId = a.Element("MRLTypeID").Value,
                                                                     mrlTypeName = a.Element("MRLTypeName").Value,
                                                                     deferredToMarketId = a.Element("DeferredToMarketID").Value,
                                                                     deferredToMarketName = a.Element("DeferredToMarketName").Value,
                                                                     undefinedCommodityLinkId = a.Element("UndefinedCommodityLinkInd").Value,
                                                                     mrlValueInPPM = a.Element("MRLValueInPPM").Value,
                                                                     residueDefinition = a.Element("ResidueDefinition").Value,
                                                                     additionalRegulationNotes = a.Element("AdditionalRegulationNotes").Value,
                                                                     expiryDate = a.Element("ExpiryDate").Value,
                                                                     primaryInd = a.Element("PrimaryInd").Value,
                                                                     exemptInd = a.Element("ExemptInd").Value
                                                                 })

                               };
                    foreach (var item in mrls)
                    {
                        Console.WriteLine(item.ToString());
                    }
                }
            }
        }
如果您注意到我正在尝试仅获取MRLs子体,但出现以下错误:

在a变量上,我只能看到MRL->MRL的第一个节点不是所有节点,发生了什么

如果你们能帮我一把,那就太好了

提前谢谢。

有了这句话

from a in m.Element("MRLs").Descendants()
…将遍历所有子元素,包括子元素的子元素。因此您的错误,因为您的元素没有子元素

除非您要专门返回所有级别的所有子元素,否则始终使用元素和元素轴,而不是子代和子代:

那应该能解决你的问题

但是,使用嵌套的foreach循环和对id的多个测试也很难读取查询。您可以使用LINQ和XPath的组合来简化它:

var mrls =
    from market in markets
    from ingredient in ingredientes
    from commodity in commodities
    let xpath = $"/MRLGroups/MRLGroup[{market.MarketId}]" +
        $"[ActiveIngredientID={ingredient.ActiveIngredientId}]" +
        $"[IndexCommodityID={commodity.IndexCommodityID}]/MRLs/MRL"
    select new {
        ms =
            (from a in doc.XPathSelectElements(xpath)
            select new xMRLIndividial {
                publishedCommodityID = string.IsNullOrEmpty(a.Element("PublishedCommodityID").Value) ? "" : a.Element("PublishedCommodityID").Value,
                publishedCommodityName = a.Element("PublishedCommodityName").Value,
                mrlTypeId = a.Element("MRLTypeID").Value,
                mrlTypeName = a.Element("MRLTypeName").Value,
                deferredToMarketId = a.Element("DeferredToMarketID").Value,
                deferredToMarketName = a.Element("DeferredToMarketName").Value,
                undefinedCommodityLinkId = a.Element("UndefinedCommodityLinkInd").Value,
                mrlValueInPPM = a.Element("MRLValueInPPM").Value,
                residueDefinition = a.Element("ResidueDefinition").Value,
                additionalRegulationNotes = a.Element("AdditionalRegulationNotes").Value,
                expiryDate = a.Element("ExpiryDate").Value,
                primaryInd = a.Element("PrimaryInd").Value,
                exemptInd = a.Element("ExemptInd").Value
            }).ToList()
    };

看来我只是个白痴。刚刚注意到我没有要求使用MRLS节点,下面是现在正在使用的:ms=newlistfroma in m.ElementMRLs.genderantsmrlinteresting方法。。。这里的问题是我被困在VisualStudio2008上,这意味着我正在使用.NET3.5。。。我可以在我的环境中使用它吗?快速且不干净的复制/粘贴提供了大量错误。您不能使用字符串的$形式。但是您可以改用String.Format。
var mrls =
    from market in markets
    from ingredient in ingredientes
    from commodity in commodities
    let xpath = $"/MRLGroups/MRLGroup[{market.MarketId}]" +
        $"[ActiveIngredientID={ingredient.ActiveIngredientId}]" +
        $"[IndexCommodityID={commodity.IndexCommodityID}]/MRLs/MRL"
    select new {
        ms =
            (from a in doc.XPathSelectElements(xpath)
            select new xMRLIndividial {
                publishedCommodityID = string.IsNullOrEmpty(a.Element("PublishedCommodityID").Value) ? "" : a.Element("PublishedCommodityID").Value,
                publishedCommodityName = a.Element("PublishedCommodityName").Value,
                mrlTypeId = a.Element("MRLTypeID").Value,
                mrlTypeName = a.Element("MRLTypeName").Value,
                deferredToMarketId = a.Element("DeferredToMarketID").Value,
                deferredToMarketName = a.Element("DeferredToMarketName").Value,
                undefinedCommodityLinkId = a.Element("UndefinedCommodityLinkInd").Value,
                mrlValueInPPM = a.Element("MRLValueInPPM").Value,
                residueDefinition = a.Element("ResidueDefinition").Value,
                additionalRegulationNotes = a.Element("AdditionalRegulationNotes").Value,
                expiryDate = a.Element("ExpiryDate").Value,
                primaryInd = a.Element("PrimaryInd").Value,
                exemptInd = a.Element("ExemptInd").Value
            }).ToList()
    };