我有一个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;
}
答案 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,
});