网络的 Lambda 表达式 API

Lambda Expression to Web API

我正在尝试将 Lambda 表达式传递给 Web API 2 调用,但不确定如何进行。

让我给你一些背景知识

设置 Web API 2,利用 Entity Framework 与数据库通信。

我的应用程序最终调用 Web API2 以便能够与数据库通信。我的公司最终需要这样做以增加数据访问层的安全性。

我们已经在应用程序端构建了一个与 Web 通信的存储库 API 就好了。但是,我们要添加的函数之一是包含 Lambda 表达式的 FIND 函数。

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;
}

我的问题现在在 Web 上 API 控制器 2 如何让它接受 Lambda 表达式?我需要在控制器中放入什么才能看到这个?我需要转换 Lambda 表达式吗?

您不能直接将 Lamda 表达式传递给 Web Api 2. 当您说必须以某种方式转换它时,您是对的。这里有几个选项。

使用odata

这适用于 Entity Framework,并附带 Visual Studio (2012 / 2013) 中的模板。 odata 位于 Web 之上 Api 2. 基本上,已经为您定义了一堆运算符(等于、包含、大于等)。借助 odata 和 entity framework,一切都已为您完成。默认情况下,这应该已经是 Visual Studio 的一部分,这是 Microsoft 推出的东西。http://www.odata.org/

手动转换

控制器中的每个方法都可以接收所需的参数(int skip、int take、string where、string order by),然后由您来应用它。这意味着您必须尝试并提出自己的规则和语法来完成这项工作。

使用动态linq

如相关回答中所述。这是一种在运行时动态使用 linq build 的方法。您基本上可以在查询字符串中传递它并将其向前传递。您将必须弄清楚您的存储库接受什么与您的 Api 接受什么以及如何转换或传递它。你还必须小心,不要允许超过你真正想要的。 http://weblogs.asp.net/scottgu/dynamic-linq-part-1-using-the-linq-dynamic-query-library