Linq-如何根据另一个表中的数据过滤数据集
本文关键字:数据 过滤 数据集 何根 另一个 Linq- | 更新日期: 2023-09-27 18:27:56
我希望像过滤where <value> in (select <value> from other_table where year=2016)
一样过滤数据集中的数据
所以我有一个"价值"列表:
var BUs = (from b in dc.BusinessUnits
where b.Year == int.Parse(ddlYears.SelectedValue)
orderby b.BuName
select new { b.BUID }).ToList();
所以我需要做的是根据BUs var.中返回的BUID列表来过滤这个数据集
IQueryable<Market> markets = (from p in dc.Markets
orderby p.MarketName
select p);
帮助?我是linq的新手,所以我需要一个简洁的解决方案。
如果Market
实体有一个BUID
属性,并且这个属性是基元类型(int
,string
..)或enum
,那么可以使用Contains
方法:
var BUs = (from b in dc.BusinessUnits
where b.Year == int.Parse(ddlYears.SelectedValue)
orderby b.BuName
select b.BUID );
IQueryable<Market> markets = (from p in dc.Markets
where BUs.Contains(p.BUID)
orderby p.MarketName
select p);
根据内存id列表进行筛选的标准方法是使用Enumerable.Contains方法。但您首先需要确保您的列表包含id——按照您编写的方式,它将包含匿名类型,属性为BUID
,通过更改第一个查询(如)
int year = int.Parse(ddlYears.SelectedValue);
var BUIDs = (from b in dc.BusinessUnits
where b.Year == year
orderby b.BuName
select b.BUID).ToList();
然后使用
var markets = (from p in dc.Markets
where BUIDs.Contains(p.BUID)
orderby p.MarketName
select p);
但请注意,这将是低效的。更好的选择是不使用BUID列表进行过滤,而是将这两个查询组合起来,这样整个查询就变成了在数据库中执行的单个查询,就像这个一样
var markets = (from p in dc.Markets
where dc.BusinessUnits.Any(bu => b.Year == year && b.BUID == p.BUID)
orderby p.MarketName
select p);
如果用你的话,这完全等同于,就像你在做"where in(从other_table中选择,where year=2016)"一样。