我有这个LINQ查询
dbContext.Customers.Where(c => c.AssetTag == assetTag).Count();
Run Code Online (Sandbox Code Playgroud)
要么
(from c in dbContext.Customers
where c.AssetTag == assetTag
select c).Count();
Run Code Online (Sandbox Code Playgroud)
生成的SQL是
SELECT
[GroupBy1].[A1] AS [C1]
FROM ( SELECT
COUNT(1) AS [A1]
FROM [dbo].[Customer] AS [Extent1]
WHERE (([Extent1].[AssetTag] = @p__linq__0) AND ( NOT ([Extent1].[AssetTag] IS NULL OR @p__linq__0 IS NULL))) OR (([Extent1].[AssetTag] IS NULL) AND (@p__linq__0 IS NULL))
) AS [GroupBy1]
Run Code Online (Sandbox Code Playgroud)
那么为什么LINQ会为一个简单的where语句生成如此复杂的SQL呢?
我有一个旧的存储过程我正在重写为EF Linq查询但是proc几乎快了3倍!
这是查询语法的示例:
public string GetStringByID(long ID)
{
return dataContext.Table2.FirstOrDefault(x => x.Table2ID == ID).Table1.StringValue;
}
Run Code Online (Sandbox Code Playgroud)
这是我正在使用的sproc代码以及调用它的方法.
sproc是:
PROCEDURE [dbo].[MyQuickerProc]
@ID bigint
AS
BEGIN
SET NOCOUNT ON;
IF EXISTS(SELECT TOP 1 ID FROM Table2 WHERE Table2ID = @Id)
BEGIN
SELECT TOP 1 t1.StringValue
FROM Table2 t2
INNER JOIN Table1 t1 ON t1.Table1ID= Table2.Table1ID
WHERE Table2ID = @ID
END
ELSE
BEGIN
SELECT TOP 1 t1.StringValue
FROM Table2 t2
INNER JOIN Table1 t1 ON t1.Table1Id = Table2.Table1ID
WHERE Table2ID IS NULL
END
END …Run Code Online (Sandbox Code Playgroud)