我的問題與此類似:How do I map an OData query against a DTO to an EF entity? 我有一個簡單的設置來測試ASP.NET Web API OData V4 $過濾功能。我想要做的是爲ProductDTO的某些屬性「別名」以匹配產品實體的屬性。用戶將調用的ProductsController例如有以下要求:如何將OData查詢映射到DTO到另一個實體?
獲得產品$過濾器=顯示名稱EQ '測試'
產品類:
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public int Level { get; set; }
public Product()
{ }
}
的ProductDTO類:
public class ProductDTO
{
public int Id { get; set; }
public string DisplayName { get; set; }
public int DisplayLevel { get; set; }
public ProductDTO(Product product)
{
this.DisplayName = product.Name;
this.DisplayLevel = product.Level;
}
}
ProductsController:
public class ProductsController : ApiController
{
public IEnumerable<ProductDTO> Get(ODataQueryOptions<Product> q)
{
IQueryable<Product> products = this._products.AsQueryable();
if (q.Filter != null) products = q.Filter.ApplyTo(this._products.AsQueryable(), new ODataQuerySettings()) as IQueryable<Product>;
return products.Select(p => new ProductDTO(p));
}
}
當然,我收到以下異常:
找不到一個叫上輸入 '顯示名稱' 財產 'TestAPI.Models.Product'
我試着通過將以下行添加到WebApiConfig.cs中,使用新引入的別名功能:
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
…
IEdmModel model = GetModel();
config.MapODataServiceRoute("*", "*", model);
}
private static IEdmModel GetModel()
{
ODataModelBuilder builder = new ODataConventionModelBuilder();
EntitySetConfiguration<Product> products = builder.EntitySet<Product>("Product");
products.EntityType.Property(p => p.Name).Name = "DisplayName";
products.EntityType.Property(p => p.Level).Name = "DisplayLevel";
return builder.GetEdmModel();
}
}
我想我錯誤地使用了別名功能,因爲拋出了與上面描述的相同的異常。如果我調用它的工作原理如下要求,但這不是我想要實現:
獲得產品$濾芯的名稱EQ「測試」
更新:
我同意gdoron,該Get
終點應該是這樣的:
public IEnumerable<ProductDTO> Get(ODataQueryOptions<ProductDTO> q)
但這應該是可以解決的,而不AutoMapper?
冠軍。它對我來說就像一個魅力。 – Immortal 2015-11-12 13:38:27
聰明!爲什麼使用automapper,而你完全可以用C#來完成它。它也可以通過可查詢和表達式樹來完成。 – user1019042 2016-10-13 13:06:44