没有外部DLL的Lambda表达式到SQL查询

问题描述 投票:1回答:1

我想将lambda表达式转换为SQL查询。要做到这一点,我做了:

public class User
{
    public string FirstName {get; set;}
    public string LastName {get; set;}
    public string Address {get; set;}
    public int Age {get; set;}
}

var user = new List<User>();
IQueryable<User> query = user.Where(x => x.Age >= 33).AsQueryable();

'query'变量是{System.Linq.Enumerable + WhereListIterator`1 [Domain.User]}。

但是我希望IQueryable<User> query = user.Where(x => x.Age >= 33).AsQueryable();代码变成'select FirstName, LastName, Address, Age from User where Age >= 33'

我怎样才能做到这一点?

重要的提示:

  • 我没有使用EF,因为数据库是OLE DB。
c# sql linq lambda iqueryable
1个回答
0
投票

在撰写查询时,在内部通过创建一个新的(可能更大的)Expression树(query.Expression)来形成新查询,所有这些树都位于提供者(query.Provider)之上。

如果你当前没有提供者(LINQ-to-Objects除外),那么理论上你仍然可以从查询中获取表达式树(通过query.Expression),但你仍然可以在你面前完成所有工作从那里生成SQL。这几乎是提供商的全部目的。任何事情都没有单一的“OLE DB”语法也无济于事 - 您仍然需要以实际端点所期望的特定语言变体发出命令。

所以;你可以通过以下方式获得lambda:

var query = list.AsQueryable().Where(x => x.Age >= 35);
var lambda = query.Expression;

但要自己做这个,你必须仔细挑逗表达树,丢弃根列表对象,只需将内部lambda带到Expression.Call(对于“Where”),然后编写自己的SQL生成器,理解一些基本表达式树,并了解您要发出的SQL变体。

坦率地说,这将是一项很多工作,而且可能不是很好地利用你的时间。如果您需要支持的只是基本过滤器,那么编写一个基本过滤器DSL的分流码实现可能会更快。

© www.soinside.com 2019 - 2024. All rights reserved.