Я использую OData v4 с Web API 2.2.OData v4 - Выберите конкретное поле в объекте
У меня есть сущность, называемая «Лицо» с составными ключами «FirstName» и «LastName». Похоже, это:
public class Person {
public string FirstName {get; set;}
public string LastName {get; set;}
public double Age {get; set;}
}
Для поддержки составных ключей, я добавил Ури соглашения поверх установленного по умолчанию, это выглядит следующим образом:
public class CompositeKeyRoutingConvention : EntityRoutingConvention
{
public override string SelectAction(ODataPath odataPath, HttpControllerContext controllerContext, ILookup<string, HttpActionDescriptor> actionMap)
{
var action = base.SelectAction(odataPath, controllerContext, actionMap);
if (action != null)
{
var routeValues = controllerContext.RouteData.Values;
if (routeValues.ContainsKey(ODataRouteConstants.Key))
{
var keyRaw = (string)routeValues[ODataRouteConstants.Key];
var compoundKeyPairs = keyRaw.Split(',');
if (!compoundKeyPairs.Any())
{
return action;
}
foreach (var compoundKeyPair in compoundKeyPairs)
{
var pair = compoundKeyPair.Split('=');
if (pair.Length != 2)
{
continue;
}
var keyName = pair[0].Trim();
var keyValue = pair[1].Trim();
routeValues.Add(keyName, keyValue);
}
}
}
return action;
}
Мой код вызова пытается получить доступ возраст человека, например, так:
http://localhost:46028/Person(firstName='Blah',LastName='Blu')/Age
Я получаю эту ошибку:
{ "error": { "code": "", "message": "Не найден ресурс HTTP, соответствующий запросу URI 'http: //: 46028/Person (firstName =' Blah ', LastName =' Blu ')/Age '. "," Innererror ": { " message ":" Не найдено соглашения о маршрутизации для выбора действия для пути OData с шаблоном' ~/entityset/key/property '. "," Type ":" », "StackTrace": ""} }}
мой контроллер имеет два метода:
public IQueryable<Person> Get()
{
return _db.People;
}
public Person Get([FromODataUri] string firstName, [FromODataUri] string lastName)
{
var person = _db.People
.FirstOrDefault(x => x.FirstName == firstName && x.LastName== lastName);
if (person == null)
{
throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.NotFound));
}
return person;
}
На самом деле есть образцы для составного ключа http://aspnet.codeplex.com/SourceControl/latest#Samples/WebApi/OData/v4/ODataCompositeKeySample/. HTH – QianLi
Да, на самом деле код будет очень похож на тот образец, который вы упомянули, однако вопрос был в том, когда я выбираю конкретное поле вместо всего объекта, например. peopleServiceContext.Where (x => x.First .....). Выберите (x => x.Age) ;. Спасибо хоть. –