使用EF 6过滤

时间:2015-01-01 04:30:41

标签: linq entity-framework

我有一个返回IEnumerable of Materials的方法

  public IEnumerable<Materials> ListMyMaterials(int organization)

我想在控制器中对其进行过滤,以仅返回在传入的组织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&#39;到了布尔&#39;
2)无法将lambda表达式转换为委托类型&#39; System.Func&lt; {}。Models.Materials,int,bool&gt;&#39;因为块中的某些返回类型不能隐式转换为委托返回类型

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

使用相关对象中的属性过滤返回数据集的正确方法是什么?

2 个答案:

答案 0 :(得分:0)

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

(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
         })

我没有关于表格架构的任何信息,这就是为什么在我上面的LINQ查询中我通过将OrganizationID视为加入密钥来完成加入。

此处,您的返回类型为IQueryable<Material>

答案 1 :(得分:0)

这是因为这个表达式:

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

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