网络的 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
我正在尝试将 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