2017-02-14 14 views
1

У меня есть ASP.NET Web API 2, отображающий конечную точку OData.Получение подмножества строк из конечной точки OData

В интерфейсе я использую ASP.NET MVC 5. Чтобы использовать конечную точку, я использую ссылки WCF Services.

Проблема, с которой я сталкиваюсь, заключается в том, что мне нужно получить подмножество строк из конечной точки, учитывая список идентификаторов.

Вот сущность я использую в OData конечной

class MyEntity 
{ 
    public int ID {get; set;} 
    public string Name {get; set;} 
    public int Age {get; set;} 
} 

Использование LINQ Я решил это в других ситуациях, используя следующее заявление

var result = entitiesContext.MyEntity 
    .Where(x => idsEmployees.Select(y => y).Contains(x.ID)); 

где idsEmployees является списки идентификаторов сотрудников, которых я должен получить.

Используя это утверждение в текущем сценарии я получаю следующее исключение: перевод выражения Linq

Ошибки в URI: Метод «Содержит» не поддерживается.

Как я могу это решить?

спасибо.

+0

'$ filter' может быть что вы ищете, но не положительно (вопрос путается с лиллом) https://docs.microsoft.com/en-us/aspnet/web-api/overview/odata-support-in-aspnet-web- api/support-odata-query-options –

+0

Является ли OData v4, правильно? Фильтрация с клиента? – octavioccl

+0

@octavioccl да – vcRobe

ответ

1

После некоторого копания я нашел решение в этом дневнике

https://blogs.msdn.microsoft.com/phaniraj/2008/07/16/set-based-operations-in-ado-net-data-services/

Вот метод расширения, что решить проблему

/// <summary> 
/// Retrieves the subset of entities in a table exposed through OData 
/// </summary> 
/// <typeparam name="T">Entity type</typeparam> 
/// <typeparam name="U">Subset type</typeparam> 
/// <param name="query"></param> 
/// <param name="Set"></param> 
/// <param name="propertyExpression"></param> 
/// <returns></returns> 
public static DataServiceQuery<T> SubSet<T, U>(
    this DataServiceQuery<T> query, 
    IEnumerable<U> Set, 
    Expression<Func<T, U>> propertyExpression) 
{ 
    //The Filter Predicate that contains the Filter criteria 
    Expression filterPredicate = null; 
    //The parameter expression containing the Entity Type 
    var param = propertyExpression.Parameters.Single(); 
    //Get Key Property 
    //The Left Hand Side of the Filter Expression 
    var left = propertyExpression.Body; 
    //Build a Dynamic Linq Query for finding an entity whose ID is in the list 
    foreach (var id in Set) 
    { 
     //Build a comparision expression which equats the Id of the Entity with this value in the IDs list 
     // ex : e.Id == 1 
     Expression comparison = Expression.Equal(left, Expression.Constant(id)); 
     //Add this to the complete Filter Expression 
     // e.Id == 1 or e.Id == 3 
     filterPredicate = (filterPredicate == null) 
      ? comparison 
      : Expression.Or(filterPredicate, comparison); 
    } 

    //Convert the Filter Expression into a Lambda expression of type Func<Lists,bool> 
    // which means that this lambda expression takes an instance of type EntityType and returns a Bool 
    var filterLambdaExpression = 
     Expression.Lambda<Func<T, bool>>(filterPredicate, param); 
    return (DataServiceQuery<T>)query.Where<T>(filterLambdaExpression); 
} 

и вот способ использовать его

var result = entitiesContext.MyEntity.Subset<MyEntity, int>(idsEmployees, x => x.ID);