如何在LINQ联接中添加Where条件

时间:2016-12-20 16:11:23

标签: c# entity-framework linq entity-framework-6

我正在使用Entity Framework 6和ASPNet Core 1.1。

我正在尝试获取制造商列表和附加的资产数量。

Assets.ManufacturerID -> Manufacturers.ManufacturerID

以下查询工作正常,几乎可以得到我想要的结果。

var result = (from m in _context.Manufacturers
                join a in _context.Assets                         
                on m.ManufacturerID.ToString() equals a.ManufacturerID                                                   
                into joined
                where m.status == 0
                select new AssetsDB.ViewModels.ManufacturerIndexViewModel()
                {
                    ManufacturerID = m.ManufacturerID,
                    Description = m.Description,
                    Count = joined.Count()
                });

但是,我只想引入额外的where语句来过滤资产的状态。

我尝试在加入&之后使用以下内容声明,但它没有工作,并继续说'一个'在当前上下文中不存在

where a.state == 0
where m.status == 0 && a.state == 0

您能否告诉我如何实现这一目标?

2 个答案:

答案 0 :(得分:4)

在应用Assets之前过滤join集合:

var result = (  from m in _context.Manufacturers
                join a in _context.Assets.Where(a=>a.state==0) //Add this                       
                on m.ManufacturerID equals a.ManufacturerID into joined
                where m.status == 0
                select new AssetsDB.ViewModels.ManufacturerIndexViewModel()
                {
                    ManufacturerID = m.ManufacturerID,
                    Description = m.Description,
                    Count = joined.Count()
                });

问题是你正在做group join,其中结果选择器可以访问第一个集合的每个元素,但不能单独访问第二个集合的元素。换句话说,对于第一个集合的每个实体,第二个集合的相关实体将被分组到joined集合中,这就是您在结果选择器中可以访问的内容。

答案 1 :(得分:2)

这是Lambda方式

var result = _context.Manufacturers
   .Where(m => m.status == 0)
   .Join(_context.Assets.Where(a => a.state == 0), 
         a => a.ManufacturerID,
         m => m.ManufacturerID.ToString(),
        (a,m) => new AssetsDB.ViewModels.ManufacturerIndexViewModel
                 {
                         ManufacturerID = m.ManufacturerID,
                         Description = m.Description,
                         Count = m.Count()
                 }
   )
   .ToList();