我在Asp.Net Web Api应用程序中有一个ODataController,它允许OData查询。我只允许读取操作,不允许更新操作。为了不直接暴露数据模型,我创建了一组DTOs。DTOs上的属性名称不一定与EF模型上的属性名称匹配。这会导致当我尝试使用OData查询EF模型时出现问题。我查看了StackOverflow上关于此主题的其他帖子,但似乎没有解决此问题的方法。
以下是我目前拥有的内容:
这在我引用select或filter中的特定字段之前是有效的。一旦我在我的OData查询中引用字段,我就会得到一个ODataException错误,如 -
似乎我需要解析查询,然后使用正确的名称替换字段引用。我发现ODataUriParser似乎可以帮助解决这个问题,但它不如我希望的那样干净。
有人能给我提供一些解决此问题的指针吗?是否有更好的方法?
以下是我目前拥有的内容:
public IQueryable<Customer> GetCustomer(ODataQueryOptions<Customer> query)
{
ODataModelBuilder builder = new ODataConventionModelBuilder();
builder.EntitySet<Customer>("Customers");
builder.EntitySet<RECORD>("Records");
builder.Namespace = "MyDataService.Models";
var opts = new ODataQueryOptions<RECORD>(new ODataQueryContext(builder.GetEdmModel(), typeof(RECORD)), this.ActionContext.Request);
var records = (IQueryable<RECORD>)opts.ApplyTo(db.RECORDS);
return ConvertToCustomerList(records);
}
这在我引用select或filter中的特定字段之前是有效的。一旦我在我的OData查询中引用字段,我就会得到一个ODataException错误,如 -
Could not find a property named 'LastName' on type 'MyDataService.Models.RECORD
。这是因为EF属性具有不同的命名约定。在此情况下,应使用“LAST_NAME”。似乎我需要解析查询,然后使用正确的名称替换字段引用。我发现ODataUriParser似乎可以帮助解决这个问题,但它不如我希望的那样干净。
有人能给我提供一些解决此问题的指针吗?是否有更好的方法?
Customer
和CustomerDto
。在我的控制器中,当查询GetAll
时,我希望返回DTOs,而当查询单个对象时,返回Customer
。 - Shimmy Weitzhandler