Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Web API的Lambda表达式_C#_Asp.net Web Api_Lambda_Asp.net Mvc 5_Asp.net Web Api2 - Fatal编程技术网

C# Web API的Lambda表达式

C# Web API的Lambda表达式,c#,asp.net-web-api,lambda,asp.net-mvc-5,asp.net-web-api2,C#,Asp.net Web Api,Lambda,Asp.net Mvc 5,Asp.net Web Api2,我试图将Lambda表达式传递给WebAPI2调用,但不确定如何使其工作 让我给你一些背景资料 设置一个利用实体框架与数据库通信的Web API 2 我的应用程序最终调用Web API 2,以便能够与数据库通信。我的公司最终要求这一点,以增加数据访问层的安全性 我们在应用程序端构建了一个与Web API通信的存储库。但是,我们要添加的函数之一是包含Lambda表达式的FIND函数 public IEnumerable<T> FindAll(Func<T, bool> ex

我试图将Lambda表达式传递给WebAPI2调用,但不确定如何使其工作

让我给你一些背景资料

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

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

我们在应用程序端构建了一个与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;
}
public IEnumerable FindAll(Func exp)
{
HttpClientHandler hndlr=新的HttpClientHandler();
hndlr.UseDefaultCredentials=true;
HttpClient HttpClient=新的HttpClient(hndlr);
httpClient.BaseAddress=新Uri(ADMS.Utilities.Settings.DALService);
HttpResponseMessageResponse=httpClient.GetAsync(string.Format(“api/{0}/{1}”,typeof(T.Name,exp)).Result;
if(响应。IsSuccessStatusCode)
{
返回response.Content.ReadAsAsync().Result.ToList();
}
返回null;
}

我现在的问题是在控制器的WebAPI2端,我如何让它接受Lambda表达式?我需要在控制器中放入什么才能看到这一点?我需要转换Lambda表达式吗

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

使用odata

它与实体框架一起工作,并在Visual Studio中随模板一起提供(2012/2013)。odata位于WebAPI2之上。基本上,已经为您定义了一组运算符(等于、包含、大于等)。有了odata和实体框架,一切都可以为您完成。默认情况下,这应该已经是VisualStudio的一部分了,它是由Microsoft推动的

手动转换

控制器中的每个方法都可以接受所需的参数(int skip、int take、string where、string order by),然后由您应用这些参数。这意味着您必须尝试提出自己的规则和语法来实现这一点

使用动态linq


如相关答案所述。这是一种在运行时动态使用linq构建的方法。实际上,您可以在查询字符串中传递它并将其转发。您必须弄清楚您的存储库接受的内容与Api接受的内容,以及如何转换或传递这些内容。你还必须小心,不要允许超过你真正想要的

相关:。基本上,不是“开箱即用”可以序列化表达式树。但是你真的想允许吗?确切地说,我不确定我是否想要,也许更好的问题是我应该如何在控制器中执行查找选项,这样我就不会查询整个数据库。可以说,你真的是在密闭舱口的错误一侧执行此操作。定义一个对您的情况足够好的接口,并在另一端处理构造实际LINQ查询。您希望尽可能地限制输入。而不是传递
Func
,您确实需要一些表达式树。理想情况下,不是表达式(选项太多),而是。。。