【问题标题】:Convert SQL Query back to Linq Expression programmatically以编程方式将 SQL 查询转换回 Linq 表达式
【发布时间】:2009-05-21 07:00:36
【问题描述】:

是否有可能以某种方式以编程方式将 sql 查询转换为 linq 表达式树? sql查询应该是由这个linq查询生成的,所以我认为它是一个穷人将linq查询序列化\反序列化为t-sql格式。

谢谢。

【问题讨论】:

    标签: linq linq-to-sql expression-trees


    【解决方案1】:

    一切皆有可能,只需要一卡车的工作量。问题是您首先必须解析 SQL 查询,并解释 AST 以将其转换为 linq 表达式树。这不是微不足道的,因为 Linq 与 sql 不是 1:1 兼容:例如,在 linq 中,groupby 上的聚合是 groupby 外部的,而在 SQL 中它们是内部的:它们必须在相同的范围内作为 groupby 否则他们将无法工作。将 linq 查询转换为 SQL 查询需要这种信息,反之亦然。

    所以为了存储查询,我选择了不同的路线,例如规范模式

    【讨论】:

      【解决方案2】:

      我不相信 LINQ-to-SQL 中内置了任何东西。

      理论上我敢说这是可能的(尽管它不能保证往返,因为有不同的方式来表达相同的查询) - 但很难做好。

      【讨论】:

        【解决方案3】:

        可以帮助您的东西 - LINQPad。我想,它不能将 SQL 转换为 LINQ 查询,但它可以将 LINQ 转换为 SQL。

        一种选择是从 SQL 生成的 IL 代码中进行跟踪。例如:

        SELECT TOP (50) [t0].[Id], [t0].[tralala]
        FROM [pamparam] AS [t0]
        

        生成:

        IL_0001:  ldarg.0     
        IL_0002:  call        LINQPad.User.TypedDataContext.get_pamparam
        IL_0007:  ldc.i4.s    32 
        IL_0009:  call        System.Linq.Queryable.Take
        IL_000E:  call        LINQPad.Extensions.Dump
        

        这样很明显,LINQ 查询看起来像:

        pamparam.Take (50)
        

        【讨论】:

        • Oh d*mn... 问题是 - 是否可以以编程方式执行此操作。 ://
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多