代码之家  ›  专栏  ›  技术社区  ›  James Dunne

将IQueryable实例转换为字符串中的LINQ语法

  •  1
  • James Dunne  · 技术社区  · 16 年前

    我想知道是否有人在将IQueryable实例格式化回字符串中的LINQ C语法方面做过工作。对于我正在构建的内部linqtosql审计框架来说,这是一个很好的特性。一旦我的框架从数据存储库方法获得IQueryable实例,我想输出如下内容:

    此LINQ查询:

    from ce in db.EiClassEnrollment
    join c in db.EiCourse on ce.CourseID equals c.CourseID
    join cl in db.EiClass on ce.ClassID equals cl.ClassID
    join t in db.EiTerm on ce.TermID equals t.TermID
    join st in db.EiStaff on cl.Instructor equals st.StaffID
    where (ce.StudentID == studentID) && (ce.TermID == termID) && (cl.Campus == campusID)
    select new { ce, cl, t, c, st };
    

    DECLARE @p0 int;
    DECLARE @p1 int;
    DECLARE @p2 int;
    SET @p0 = 777;
    SET @p1 = 778;
    SET @p2 = 779;
    SELECT [t0].[ClassEnrollmentID], ..., [t4].[Name]
    FROM [dbo].[ei_ClassEnrollment] AS [t0]
    INNER JOIN [dbo].[ei_Course] AS [t1] ON [t0].[CourseID] = [t1].[CourseID]
    INNER JOIN [dbo].[ei_Class] AS [t2] ON [t0].[ClassID] = [t2].[ClassID]
    INNER JOIN [dbo].[ei_Term] AS [t3] ON [t0].[TermID] = [t3].[TermID]
    INNER JOIN [dbo].[ei_Staff] AS [t4] ON [t2].[Instructor] = [t4].[StaffID]
    WHERE ([t0].[StudentID] = @p0) AND ([t0].[TermID] = @p1) AND ([t2].[Campus] = @p2)
    

    正如您所看到的,我已经有了SQL输出。我只需要找到一种方法将IQueryable翻译成一个表示其原始LINQ语法的字符串(具有可接受的翻译损失)。我不怕自己写,但我想看看是否有人先写过。

    3 回复  |  直到 16 年前
        1
  •  1
  •   Justin R.    16 年前

    所有IQueryable都可以编译成 Expression Body 表示lambda表达式体的属性。在解析源代码时,可以编译每个表达式,然后输出应该规范化的主体。

        2
  •  1
  •   Ryan    16 年前

    IQueryable<T> 键入以恢复C#语法。我知道有一些可用于 Expression<Func<T>> ,但我想不起来曾经在LINQ查询中看到过这样的操作。

    更新 我对此很好奇,开始做一些研究。您可以通过 Expression IQueryable<> . 看起来您需要实现一个LINQ提供程序来呈现C而不是SQL。这绝非小事。事实上,我认为除非这是一个教育(非商业)项目,否则很难证明所需的工作量是合理的。但如果你没有胆量, here

        3
  •  0
  •   James Dunne    16 年前

    我已经为这个做了我自己的实现,因为我找不到任何可用的或源代码形式的现有工作。我在博客上写了一篇关于我工作的文章,包括了整个C源代码。你可以用它做一些非常整洁的事情。随便看看。

    http://bittwiddlers.org/?p=120