【问题标题】:Lambda Expression to Web APILambda 表达式到 Web API
【发布时间】:2015-03-19 01:07:32
【问题描述】:

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

让我给你一些背景

设置一个利用实体框架与数据库通信的 Web API 2。

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

我们在 App 端构建了一个存储库,可以很好地与 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 表达式吗?

【问题讨论】:

  • 相关:stackoverflow.com/questions/6443433/…。基本上,不是“开箱即用”,您可以序列化表达式树。但是你真的要允许这样做吗?
  • 完全正确 - 不确定我是否想要更好的问题是我应该如何在控制器中执行查找选项,这样我就不会查询整个数据库
  • 可以这么说,您确实在密封舱口的错误一侧这样做。定义一个足以满足您的案例的接口,并在另一端处理构建实际的 LINQ 查询。您想尽可能地限制输入。而不是传递Func&lt;T, bool&gt;,你真的需要一些表达式树。理想情况下 Expression&lt;Func&lt;T, bool&gt;&gt;(选项太多),但是...

标签: c# asp.net-web-api lambda asp.net-mvc-5 asp.net-web-api2


【解决方案1】:

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

使用 odata

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

手动转换

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

使用动态 linq

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

【讨论】:

    猜你喜欢
    • 2013-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-02
    • 2021-09-30
    相关资源
    最近更新 更多