使用 EF 6 进行过滤

Filtering With EF 6

我有一个方法是 returning IEnumerable of Materials

  public IEnumerable<Materials> ListMyMaterials(int organization)

我想在控制器中将其过滤为仅 return 在由传入的组织 ID 制造的产品中找到的材料。

这是我的查询:

 return db.Materials.
         Include("Organization").
         Include("ProductMaterial.Product.Organization").
         .Where(o => o.ProductMaterial.Select(p => p.Product.Organization.ID == organization)).AsQueryable();

我收到的两个错误是:

1) 无法将类型 'System.Collections.Generic.IEnumerable' 隐式转换为 'bool'
2) 无法将 lambda 表达式转换为委托类型 'System.Func<{}.Models.Materials,int,bool>',因为块中的某些 return 类型不能隐式转换为委托 return 类型

如果 属性 已经在材料上,我没有任何问题像这样过滤,但我只想要在组织拥有的产品中找到的材料。

使用在相关对象中找到的 属性 过滤 returned 数据集的正确方法是什么?

您可以编写一个简单的 LINQ 查询,而不是在上面的 Lambda 表达式中执行复杂的 Include,结果为::

(from mat in db.Materials
         join org in db.Organization on mat.OrganizationID equals org.ID
         where mat.OrganazationID=organization
         select new Material{
         ID=mat.ID,
         OrganizationID=mat.OrganizationID
         })

我没有 table 模式的任何信息,这就是为什么在我上面的 LINQ 查询中我通过将 OrganizationID 视为连接键来完成连接。

此处您的 return 类型将是 IQueryable<Material>

是因为这个表达式:

.Where(o => o.ProductMaterial.Select(p => p.Product.Organization.ID == organization))

不评估为真或假。 select 语句是子查询而不是布尔条件