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

时间:2015-12-23 16:58:34

标签: c# asp.net linq

我希望过滤数据集中的数据,就像您一样where <value> in (select <value> from other_table where year=2016)

所以我有一个&#34;值列表&#34;:

var BUs = (from b in dc.BusinessUnits
where b.Year == int.Parse(ddlYears.SelectedValue)
orderby b.BuName
select new { b.BUID }).ToList();

所以我需要做的是根据BU变量中返回的BUID列表过滤这个数据集。

IQueryable<Market> markets = (from p in dc.Markets
orderby p.MarketName
select p);

帮助?我是linq的新手,所以我需要一个简洁的解决方案。

2 个答案:

答案 0 :(得分:0)

如果{ length: 1000 }实体具有Market属性,并且此属性是原始类型(BUIDint ..)或{{1你可以使用Contains方法:

string

答案 1 :(得分:0)

在内存ID列表中过滤的标准方法是使用enter image description here方法。但是你需要首先确保你的列表包含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列表进行过滤,而是将2个查询组合在一起,这样整个事情就变成了在数据库中执行的单个查询,就像这样

var markets = (from p in dc.Markets
               where dc.BusinessUnits.Any(bu => b.Year == year && b.BUID == p.BUID)
               orderby p.MarketName
               select p);

这相当于,如果使用你的话,就像你一样做&#34;其中(从other_table中选择年份= 2016)&#34;