当我调试代码时,我总是使用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) ......
答案 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) ......