C# Linq-如何根据另一个表中的数据筛选数据集?

C# Linq-如何根据另一个表中的数据筛选数据集?,c#,asp.net,linq,C#,Asp.net,Linq,我希望筛选数据集中的数据,就像您从其他表格中选择where in,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(); 所以我需要做的是根据BusVar中返回的BUID列表过滤这个数据集 IQueryable<M

我希望筛选数据集中的数据,就像您从其他表格中选择where in,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();
所以我需要做的是根据BusVar中返回的BUID列表过滤这个数据集

IQueryable<Market> markets = (from p in dc.Markets
orderby p.MarketName
select p);
帮忙?我是linq的100%新手,所以我需要一个简洁的解决方案。

如果市场实体有一个内置属性,而这个属性是一个基本类型int,string。。或枚举,您可以使用以下方法:


通过内存id列表进行过滤的标准方法是使用方法。但是您首先需要确保您的列表中包含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 dc.BusinessUnits.Any(bu => b.Year == year && b.BUID == p.BUID)
               orderby p.MarketName
               select p);
然后使用

var markets = (from p in dc.Markets
               where BUIDs.Contains(p.BUID)   
               orderby p.MarketName
               select p);
但请注意,这将是低效的。更好的选择是不使用构建的列表进行过滤,而是将这两个查询组合在一起,这样整个查询就变成了在数据库中执行的单个查询,如下所示

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 dc.BusinessUnits.Any(bu => b.Year == year && b.BUID == p.BUID)
               orderby p.MarketName
               select p);

如果使用您的话,这完全等同于从其他表格中选择where in,where year=2016。

这是使用实体框架吗?可能重复:您上次的查询对性能不好。更好的方法是首先将所有数据加载到BuidList,然后使用BuidList.Containsp=>p.BuidWell为谓词创建新的查询,我说过,这与在SQL中编写谓词的方式是直接等价的。Ye,我认为更好的解决方案是:更改谓词中的任何。。。。像这样:b.BUID==p.BUID&b.Year==year@W92这是10-15年前的技术。今天的查询优化器完全不关心如何编写SQL。顺便说一句,我怀疑第一个查询更好——它会生成类似于。。。。其中包含潜在的大列表,而第二个列表很可能会生成联接。我假设BUID是索引列,应该考虑它:-