【发布时间】:2016-03-15 06:20:29
【问题描述】:
我有这个代码示例,我正在尝试使第三个 Get 方法工作,并且还有 $expand 工作,如下所述。
如果我只有 Get() 和 Get([FromODataUri] int key) 方法,我可以分别使用这些路由 /odata/Products 和 /odata/Products(1)?$expand=Vendor 调用它们。
但是,当我进行以下更改时,我会遇到以下问题。
如果我只将参数名称
key更改为id或方法Get([FromODataUri] int key)中的任何其他内容,则不再调用该方法。/odata/Products(1)的路由调用转到始终返回所有集合的Get()方法。如果我将参数名称放回
key,但将方法更改为其他名称,例如GetByKey([FromODataUri] int key),那么上面同样的问题又出现了。另外,如果我用
/odata/Products?key=1?$expand=Vendor打电话,电话会转到GetByKey([FromODataUri] int key),但我没有扩展供应商。并在
GetByName([FromODataUri] string name)下方添加第三种方法,当使用此路由/odata/Products('Product 1')调用时,我得到“找不到错误404”。如果使用/odata/Products?name='Product 1'或/odata/Products?name='Product 1'$expand=Vendor调用,则会触发Get()方法,并且Vendor 不会再次扩展。
非常感谢您对此的意见。
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API configuration and services
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
ODataModelBuilder builder = new ODataConventionModelBuilder();
builder.EntitySet<Product ("Products");
config.MapODataServiceRoute("ODataRoute", "odata", builder.GetEdmModel());
}
}
public class ProductsController : ODataController
{
#region
ProductsContext db = new ProductsContext();
private bool ProductExists(int key)
{
return db.Products.Any(p = p.Id == key);
}
protected override void Dispose(bool disposing)
{
db.Dispose();
base.Dispose(disposing);
}
#endregion
[HttpGet]
[EnableQuery]
public IQueryable<Product Get()
{
return db.Products.AsQueryable();
}
[HttpGet]
[EnableQuery]
public SingleResult<Product Get([FromODataUri] int key)
{
IQueryable<Product result = db.Products.Where(p = p.Id == key).AsQueryable();
return SingleResult.Create(result);
}
[HttpGet]
[EnableQuery]
public SingleResult<Product GetByName([FromODataUri] string name)
{
IQueryable<Product result = db.Products.Where(p = p.Name == name).AsQueryable();
return SingleResult.Create(result);
}
}
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
public string Category { get; set; }
public Vendor Vendor { get; set; }
}
public class Vendor
{
public int Id { get; set; }
public string Name { get; set; }
}
public class ProductsContext : IDisposable
{
public ICollection<Product Products = new List<Product ()
{
new Product()
{
Category = "A",
Id = 1,
Name = "Product 1",
Price = 10,
Vendor = new Vendor()
{
Id = 1,
Name = "Vendor 1"
}
},
new Product()
{
Category = "A",
Id = 2,
Name = "Product 2",
Price = 15,
Vendor = new Vendor()
{
Id = 1,
Name = "Vendor 1"
}
},
new Product()
{
Category = "B",
Id = 3,
Name = "Product 3",
Price = 10,
Vendor = new Vendor()
{
Id = 2,
Name = "Vendor 2"
}
},
};
public void Dispose()
{
}
}
【问题讨论】:
标签: asp.net-web-api odata