2015-01-20 2 views
3

Я пытаюсь передать выражение Lambda для вызова Web API 2 и не знаю, как это сделать.Lambda Expression to Web API

Позвольте мне дать вам некоторый фон

Настройка веб-API 2, который использует Entity Framework для связи с базой данных.

Мои приложения в конечном итоге вызывают веб-API 2, чтобы иметь возможность связываться с базой данных. Моя компания в конечном итоге требует, чтобы это обеспечило дополнительную безопасность уровня доступа к данным.

Мы создали репозиторий на стороне приложения, который прекрасно общается с веб-интерфейсом. Однако одна из функций, которую мы хотим добавить, - это функция FIND, которая включает выражение Lambda.

public IEnumerable<T> FindAll(Func<T, bool> exp) 
{ 
    HttpClientHandler hndlr = new HttpClientHandler(); 
    hndlr.UseDefaultCredentials = true; 
    HttpClient httpClient = new HttpClient(hndlr); 

    httpClient.BaseAddress = new Uri(ADMS.Utilities.Settings.DALService); 
    HttpResponseMessage response = httpClient.GetAsync(string.Format("api/{0}/{1}", typeof(T).Name, exp)).Result; 

    if (response.IsSuccessStatusCode) 
    { 
     return response.Content.ReadAsAsync<IEnumerable<T>>().Result.ToList(); 
    } 
    return null; 
} 

Вопрос у меня есть теперь на веб-API 2 стороны в контроллере, как я могу получить это принять лямбда-выражения? Что мне нужно, чтобы поставить контроллер, чтобы это увидеть? Нужно ли преобразовать выражение Lambda?

+0

относящийся: http://stackoverflow.com/questions/6443433/how-can-i-pass-a-lambda-expression-to-a-wcf-service. в основном, не «из коробки», вы можете сериализовать дерево выражений. НО * ты действительно ХОТИТЕ разрешить это *? – hometoast

+0

ТОЧНО - не уверен, что я ХОЧУ, что, может быть, лучший вопрос: как я должен использовать параметр «Найти» в контроллере, чтобы я не запрашивал всю БД –

+0

. Вы действительно делаете это на неправильной стороне воздухонепроницаемого люка, так сказать , Определите интерфейс, который достаточно хорош для ваших случаев, и обработайте фактический запрос LINQ с другой стороны. Вы хотите ограничить ввод как можно больше. И вместо передачи 'Func ' вам действительно нужно некоторое дерево выражений. Идеально * не * 'Выражение >' (слишком много вариантов), но ... – Luaan

ответ

4

Вы не можете напрямую передать выражение Lamda в Web Api 2. Вы правы, когда говорите, что вам нужно каким-то образом преобразовать его. Вот несколько вариантов.

Использование OData

Это работает с Entity Framework, и поставляется с шаблонами в Visual Studio (2012/2013). odata находится поверх Web Api 2. В принципе, существует группа операторов, уже определенных для вас (равных, содержит, больше и т. д.). С картой odata и сущности все для вас в значительной степени выполнено. Это уже должно быть частью Visual Studio по умолчанию, это толкаемое Microsoft. http://www.odata.org/

Преобразовать вручную

Каждый из ваших методов в контроллерах могут принимать в своих требуемых параметров (интермедиат пропустить, внутр взять, строка где строка заказа на), а затем он до вас, чтобы применить это , Это означает, что вам придется попробовать и придумать свои собственные правила и синтаксис, чтобы сделать эту работу.

Использование динамического LINQ

Как уже отмечались в соответствующих ответах. Это способ динамического использования linq-сборки во время выполнения. Вы можете передать это в строке запроса и передать ее вперёд. Вам нужно будет выяснить, что принимает ваш репозиторий, и то, что ваш Api принимает, и как его конвертировать или передавать. Вы также должны быть осторожны, чтобы не позволить больше, чем вы действительно хотите. http://weblogs.asp.net/scottgu/dynamic-linq-part-1-using-the-linq-dynamic-query-library