C# 集合上的Linq join集合
Series对象包含一个名为SKU的属性,它是IEnumerable 如果此sku在允许的sku列表中,则我需要该系列 在我下面的例子中,我加入了s.SeriesId,这是不正确的。 我认为应该是s.SKU系列 我只想返回集合中包含sku的系列C# 集合上的Linq join集合,c#,linq,C#,Linq,Series对象包含一个名为SKU的属性,它是IEnumerable 如果此sku在允许的sku列表中,则我需要该系列 在我下面的例子中,我加入了s.SeriesId,这是不正确的。 我认为应该是s.SKU系列 我只想返回集合中包含sku的系列 IEnumerable<Data.Models.Series> series = await _seriesRepository.GetSeriesAsync(Properties.Settings.Default.Chann
IEnumerable<Data.Models.Series> series = await _seriesRepository.GetSeriesAsync(Properties.Settings.Default.Channel, page, limit);
string[] skusInSeries = series?.SelectMany(x => x.Skus).Distinct().ToArray();
IEnumerable<string> itemNumbers = GetAllowedSkus(Customer, Shipto, EnvironmentCode, AcceptLanguage, skusInSeries, Warehouse);
var selected = from s in series
join i in itemNumbers
on s.SeriesId equals i //s.Skus IEnumerable<string>
select s;
IEnumerable series=wait _seriesRepository.GetSeriesAsync(Properties.Settings.Default.Channel,page,limit);
字符串[]skusInSeries=series?.SelectMany(x=>x.Skus).Distinct().ToArray();
IEnumerable itemNumber=GetAllowedSKU(客户、发货人、环境代码、接受语言、skusInSeries、仓库);
所选变量=从系列中的s
加入我的行列
关于s.SeriesId等于i//s.Skus IEnumerable
选择s;
或者另一种方式:
var selected = from s in series
where s.Skus.Any(sku => itemNumbers.Contains(sku))
select s;
我猜通常情况下,sku
比itemNumbers
更多,而且第一选择更好。最好将itemNumbers
更改为可以传递到数据库的列表:
var itemNumbers = GetAllowedSkus(Customer, Shipto, EnvironmentCode, AcceptLanguage, skusInSeries, Warehouse).ToList();
var selected = from s in series
where itemNumbers.Any(i => s.Skus.Contains(i))
select s;
如果不涉及SQL(或其他)数据库,您可以将itemNumbers
转换为HashSet
,以便高效查找:
var itemNumbers = new HashSet<string>(GetAllowedSkus(Customer, Shipto, EnvironmentCode, AcceptLanguage, skusInSeries, Warehouse));
var selected = from s in series
where s.Skus.Any(sku => itemNumbers.Contains(sku))
select s;
var itemNumbers=新哈希集(getAllowedSKU(客户、发货人、环境代码、接受语言、skusInSeries、仓库));
所选变量=从系列中的s
其中s.sku.Any(sku=>ItemNumber.Contains(sku))
选择s;
谢谢您的回复。成功了。我同意你的涉及哈希集的解决方案。没有使用数据库。我将查找HashSet并进一步了解它。
var itemNumbers = new HashSet<string>(GetAllowedSkus(Customer, Shipto, EnvironmentCode, AcceptLanguage, skusInSeries, Warehouse));
var selected = from s in series
where s.Skus.Any(sku => itemNumbers.Contains(sku))
select s;