c# - 如何在 LINQ 连接中添加 Where 条件

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

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

我正在尝试获取制造商列表以及与之相关的 Assets 数量。

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 语句来过滤 Assets 的状态。

我尝试在 join & on 语句后使用以下内容,但它不起作用并且一直说“a”在当前上下文中不存在

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

能否请您给我一个建议,我该如何实现?

最佳答案

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

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 集合中,这就是您在结果选择器中可以访问的内容。

关于c# - 如何在 LINQ 连接中添加 Where 条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41246657/

相关文章:

c# - 我可以从 MySql 触发器检索 Asp.net session 吗

c# - ASP.Net 网页中的强类型全局数据

c# - 代码隐藏的 ASP.NET 文件上传的生命周期是多少?

c# - EF 代码第一个没有导航属性但具有父集合属性的外键

c# - Asp.Net 5 缺少 Linq to Sql 类

c# - LINQ 平均时间跨度?

c# - 比较 Linq 中的日期逻辑

c# - 通过 HTTP 连接到 Azure Redis 缓存

c# - 包括一个集合,然后是下一级的集合

.NET Entity Framework "remembering"数据库名称不存在