【发布时间】:2015-05-12 21:00:34
【问题描述】:
我有两个模型。产品型号:
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
public virtual ICollection<Categories> Categories { get; set; }
}
还有一个类别模型:
public class Categories
{
public int Id { get; set; }
public string Name { get; set; }
public bool IsPublic { get; set; }
public virtual Product Products { get; set; }
}
如您所见,模型之间存在关系。一个产品可以有多个类别。我可以使用http://localhost/Products?$expand=Categories 查询模型。
但是,我想在返回类别之前对其进行过滤。主要目标是避免api使用者可以查询IsPublic设置为false的类别。如何在 Web API 控制器中存档?
我的第一次尝试没有成功,因为我需要一个IQueryable<Product>,它返回一个IQueryable<Categories>:
[HttpGet]
[EnableQuery]
public IQueryable<Product> Get(ODataQueryOptions<Product> odataQueryOptions)
{
if (odataQueryOptions.SelectExpand.RawExpand == "Categories")
{
var p = db.Products.First();
var result = db.Entry(p).Collection(x => x.Categories).Query().Where(x => x.IsPublic == true).AsQueryable();
return result;
}
else
{
return db.Products;
}
}
基本上我的问题是:在 LINQ 中编写类似 OData 的 $expand 查询的正确方法是什么?如果这是不可能的,我还能如何过滤扩展的导航属性?
【问题讨论】:
-
不确定您是否仍然需要这个,但我遇到了同样的问题并提出了一个“解决方案”,我已将其发布为我的own question 关于此问题的答案。它可能会帮助您或任何来这里寻找解决方案的人。
标签: entity-framework odata asp.net-web-api asp.net-web-api2