我想将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'
我怎样才能做到这一点?
重要的提示:
在撰写查询时,在内部通过创建一个新的(可能更大的)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的分流码实现可能会更快。