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

时间:2017-12-18 10:31:15

标签: c# sql linq lambda iqueryable

我想将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'

我该怎么做?

重要提示:

  • 我没有使用EF,因为数据库是OLE DB。

1 个答案:

答案 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的分流码实现可能会更快。