我正在使用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
您能否告诉我如何实现这一目标?
答案 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();