LINQ中的查找仅基于已加入集合

时间:2016-01-13 21:40:08

标签: c# linq

我有一个Scrape集合,其中一列是MPN代码。我想在Aws集合中的几个列中找到匹配的MPN代码 - 但是在Aws中MPN可以在MPN列中找到,但它也可以出现在Model,ItemPartNumber等列中。有时MPN在Aws中的多于一列的同一行中重复。

如果我在任何列中找到具有匹配MPN的行,我想停止搜索此行并从Aws中取出相应的EAN。因此,最终查询后Scrape中的行数不应更改。

然而,对于这个查询,我得到更多行,看起来它在MPN上找到匹配,然后在ItemPartNumber,Model等上单独找到并累积它们。

我将如何重新构造查询,以便在开始时使用相同数量的行获取Scrape,并使用Aws的EAN代码进行增强?

public IEnumerable<Scrape> EnhanceWith(IEnumerable<Aws> awsData)
{
    IEnumerable<Scrape> query = from scr in scrapeData
                                from aws in awsData
                                where
                                (
                                    scr.MPN == aws.ItemPartNumber ||
                                    scr.MPN == aws.Model ||
                                    scr.MPN == aws.MPN ||
                                    scr.MPN == aws.PartNumber 
                                )
                                select
                                new Scrape
                                {
                                    EAN = aws.EAN,
                                    MPN = scr.MPN,
                                    Url = scr.Url,
                                };
    return query;
}

2 个答案:

答案 0 :(得分:1)

您不需要加入馆藏,您可以查看:

IEnumerable<Scrape> query = scrapeData.Select(scr => 
{
    scr.EAN= awsData.FirstOrDefault(aws => scr.MPN == aws.ItemPartNumber ||
                                           scr.MPN == aws.Model ||
                                           scr.MPN == aws.MPN ||
                                           scr.MPN == aws.PartNumber)?.EAN;
    return scr;
});
return query;

答案 1 :(得分:1)

试试这个:

var result =
    scrapeData
    .Select(scr => 
        new
        {
            SCR = scr,
            AWS = 
                awsData
                .FirstOrDefault(aws =>
                    scr.MPN == aws.ItemPartNumber ||
                    scr.MPN == aws.Model ||
                    scr.MPN == aws.MPN ||
                    scr.MPN == aws.PartNumber)
        })
    .Where(x => x.AWS != null)
    .Select(x => new Scrape
    {
        EAN = x.AWS.EAN,
        MPN = x.SCR.MPN,
        Url = x.SCR.Url,
    });

对于scrapeData中的每个Scrape,我们在awsData中搜索第一个匹配项,然后将结果放在一个匿名对象中。然后我们过滤掉匹配的Aws为null的项目,以删除未找到匹配项的情况,然后为每个项目创建一个新的Scrape对象,其中包含原始文件所需的信息Scrape对象和找到的Aws对象。

如果您想要包含未找到匹配项的情况,那么只需删除Where方法调用,并在创建新的null对象时检查Scrape,如下所示:

    //.Where(x => x.AWS != null)
    .Select(x => new Scrape
    {
        EAN = x.AWS != null ? x.AWS.EAN : x.SCR.EAN,
        MPN = x.SCR.MPN,
        Url = x.SCR.Url,
    });