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

kb5ga3dv  于 2022-12-06  发布在  其他
关注(0)|答案(3)|浏览(202)

我想知道是否有人在字符串中将IQueryable示例格式化回LINQ C#语法。对于我正在构建的内部LINQ-to-SQL审计框架来说,这是一个很好的特性。一旦我的框架从数据存储库方法中获得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 };

生成以下LINQ-to-SQL查询:

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语法的字符串(具有可接受的转换损失)。我不害怕自己编写它,但我想看看是否有人先做了这件事。

kx5bkwkv

kx5bkwkv1#

IQueryable的所有内容都可以编译到Expression对象中。表达式有一个Body属性,表示lambda表达式的主体。您可以在分析源代码时编译每个表达式,然后输出应被规范化的主体。

b4lqfgs4

b4lqfgs42#

最好的方法是阅读C#中的表达式树。我认为您可以在IQueryable<T>类型上使用访问者模式来恢复C#语法。我知道有一些Expression<Func<T>>的实现,但我不记得曾经在LINQ查询中看到过这样的实现。

UPDATE我对此很感兴趣,并开始做一些研究。您可以通过IQueryable<>Expression属性访问底层的表达式树。看起来您需要实现一个呈现C#而不是SQL的LINQ提供程序。这远非小事一桩。事实上,我认为这将是很难证明所需的工作量,除非这是一个教育(非商业)项目。但是如果你不害怕,here看起来是一个关于LINQ提供者的优秀教程。所有的源代码也可以在Codeplex上获得。

zhte4eai

zhte4eai3#

我已经做了我自己的实现,因为我找不到任何现有的工作,是免费的或在源代码形式。我提出了一个快速的博客文章,我的工作,并包括整个C#源代码为它。你可以做一些非常整洁的东西。随时检查它。
http://bittwiddlers.org/?p=120

相关问题