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的新手,所以我需要一个简洁的解决方案。

Linq-如何根据另一个表中的数据过滤数据集

如果Market实体有一个BUID属性,并且这个属性是基元类型(intstring..)或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)"一样。