有没有办法在C#中反序列化表达式,我想将表达式存储在数据库中并在运行时加载它们.
LINQ to SQL或LINQ to Entities已经能够将LINQ转换为SQL文本字符串.但是我希望我的应用程序在不使用db上下文的情况下进行转换 - 这反过来意味着一个活动的数据库连接 - 这两个提供者都需要.
我想将LINQ表达式转换为等效的SQL字符串for WHERE和ORDER BYclauses,而不需要DB上下文依赖项,以使以下存储库接口工作:
public interface IStore<T> where T : class
{
void Add(T item);
void Remove(T item);
void Update(T item);
T FindByID(Guid id);
//sure could use a LINQ to SQL converter!
IEnumerable<T> Find(Expression<Func<T, bool>> predicate);
IEnumerable<T> FindAll();
}
Run Code Online (Sandbox Code Playgroud)
它主要是我感兴趣的表达式树遍历和变换.有没有人知道我可以合并的现有库(nuget?)在这样的自定义上下文中使用?
因为它已经构建了我自己的工作"LINQ转换为SQL文本"工具,类似于这个表达式树到SQL示例,它在我上面的存储库中工作.它允许我编写这样的代码:
IRepository<Person> repo = new PersonRepository();
var maxWeight = 170;
var results = repo.Find(x => (x.Age > 40 || x.Age < 20) && x.Weight < maxWeight); …Run Code Online (Sandbox Code Playgroud) 我试图将Lambda表达式传递给Web API 2调用,但不确定如何使其工作.
我来给你一些背景知识
设置利用Entity Framework与数据库通信的Web API 2.
我的应用程序最终调用Web API 2以便能够与数据库通信.我的公司最终要求这样可以增加数据访问层的安全性.
我们在App Side上构建了一个存储库,可以很好地与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;
}
Run Code Online (Sandbox Code Playgroud)
我现在的问题是在控制器的Web API 2端如何让它接受Lambda Expression?我需要在控制器中放置什么才能看到这个?我需要转换Lambda表达式吗?