我想将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();
&#39;查询&#39;变量是 {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'
我该怎么做?
重要提示:
答案 0 :(得分:0)
撰写查询时,在内部通过创建新的(可能更大的)Expression
- 树(query.Expression
)来形成新查询,所有这些树都位于提供程序< / em>(query.Provider
)。
如果您目前没有提供程序(LINQ-to-Objects除外),那么从理论上讲,您仍然可以使用表达式树来自一个查询(通过query.Expression
),但你仍然有在你之前的所有工作从这个方面生成SQL。这几乎是提供商的全部目的。没有单一的&#B; OLE DB&#34;它没有帮助。任何事物的语法 - 您仍然需要以实际端点所期望的特定语言变体发出命令。
因此;你可以通过以下方式获取lambda :
var query = list.AsQueryable().Where(x => x.Age >= 35);
var lambda = query.Expression;
但要自己这样做,你必须仔细挑逗表达树,丢弃根列表对象,只需将内部lambda带到Expression.Call
(对于&#34; Where&#34 ;),然后编写自己的SQL生成器,了解一些基本的表达式树和了解您要发出的SQL变体。
坦率地说,这将是很多的工作,而且可能不是很好地利用你的时间。如果您需要支持的只是基本过滤器,那么编写一个基本过滤器DSL的分流码实现可能会更快。