如何从linq或IQueryable对象获取可执行的sql语句?

时间:2017-09-13 07:29:39

标签: c# entity-framework linq

当我调试代码时,我总是使用query.ToString()来获取sql语句,但sql语句包含许多linq参数,如@p__linq__0@p__linq__1@p__linq__2等等上。它不能直接在Sql Server Management Studio中执行,我需要用实际参数值替换@p__linq__0。这是cockamamie!那么,我如何从linq或IQueryable对象获取可执行的sql语句?非常感谢你!

sql总是如下:

    SELECT *
    FROM [dbo].[Customers] AS [Extent1]
    WHERE ([Extent1].[IsCuepool] = @p__linq__0) AND 
    ([Extent1].[IsInvalid] = @p__linq__1) AND 
    ([Extent1].[IsRecovery] = @p__linq__2) AND 
    (([Extent1].[CustomerName] LIKE @p__linq__3 ESCAPE N'~') OR 
    ([Extent1].[QQ] LIKE @p__linq__4 ESCAPE N'~') OR 
    ([Extent1].[Phone] LIKE @p__linq__5 ESCAPE N'~') OR 
    ([Extent1].[BFAccount] LIKE @p__linq__6 ESCAPE N'~')) AND 
    (([Extent1].[CreateAt] = (LOWER(CASE WHEN (@p__linq__7 IS NULL) ......

2 个答案:

答案 0 :(得分:2)

您无法获得没有参数的声明。创建SQL的目的不是为了便于复制,粘贴和执行它,而是为了使运行查询变得安全。使用参数而不是组合SQL查询是防止SQL注入的重要安全功能,因此有充分的理由说明它们是如何存在的。

答案 1 :(得分:1)

我遇到这样的情况。 我在实体框架脚本的基础上在tsql中定义了一些变量。这让我不必对复制脚本进行更改

像这样

 DECLARE @p__linq__0 INT = 1;
 DECLARE @p__linq__1 INT = 2;

 SELECT *
 FROM [dbo].[Customers] AS [Extent1]
 WHERE ([Extent1].[IsCuepool] = @p__linq__0) AND 
 ([Extent1].[IsInvalid] = @p__linq__1) AND 
 ([Extent1].[IsRecovery] = @p__linq__2) AND 
 (([Extent1].[CustomerName] LIKE @p__linq__3 ESCAPE N'~') OR 
 ([Extent1].[QQ] LIKE @p__linq__4 ESCAPE N'~') OR 
 ([Extent1].[Phone] LIKE @p__linq__5 ESCAPE N'~') OR 
 ([Extent1].[BFAccount] LIKE @p__linq__6 ESCAPE N'~')) AND 
 (([Extent1].[CreateAt] = (LOWER(CASE WHEN (@p__linq__7 IS NULL) ......