SQL我已经建立了测试数据库和控制台应用程序,以确认以下内容:LinqToSql DataContext的与提取的接口并不构成对功能
给定一个SQL数据库具有以下功能:
CREATE FUNCTION ufn_GTFO
(
@Guid as uniqueidentifier
)
RETURNS VARCHAR(100)
AS
BEGIN
-- Declare the return variable here
DECLARE @Result as VARCHAR(100)
-- Add the T-SQL statements to compute the return value here
SELECT @Result = 'This is a test'
-- Return the result of the function
RETURN @Result
END
GO
而且下表:
CREATE TABLE [dbo].[Test](
[PKey] [int] IDENTITY(1,1) NOT NULL,
[WFT] [uniqueidentifier] NULL,
CONSTRAINT [PK_Test] PRIMARY KEY CLUSTERED
(
[PKey] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
的标量值函数ufn_GTFO通常是可组合的,从而使下面的C#:
static void ConcreteTest()
{
DataClasses1DataContext db = new DataClasses1DataContext();
var q = from t in db.Tests
select new { t.PKey, GTFO = db.ufn_GTFO(t.WFT) };
var p = q.ToArray();
}
翻译成下面的SQL:
SELECT [t0].[PKey], [dbo].[ufn_GTFO]([t0].[WFT]) AS [GTFO] FROM [dbo].[Test] AS [t0]
但是,如果我用重构 - 上的DataContext>提取接口,并且使用的是一个实例:
static void InterfaceTest()
{
IDataClasses1DataContext db = new DataClasses1DataContext();
var q = from t in db.Tests
select new { t.PKey, GTFO = db.ufn_GTFO(t.WFT) };
var p = q.ToArray();
}
我获取以下SQL,并且对每条记录调用ufn_GTFO会发生一次,如.ToArray()枚举结果。
SELECT [t0].[PKey], [t0].[WFT] AS [guid]
FROM [dbo].[Test] AS [t0]
所以,我的问题是,为什么会发生这种情况,我能做些什么来防止它同时仍使用界面?
更新1:我比较了IL的具体方法与接口方法产生的,并且它们仅在参考到接口和一个编译器生成的显示类,似乎不具有任何不同影响结果。
我不会发布一个答案,因为我不从LINQ的角度知道,但我确实知道,SQL服务器也会在第一个查询中为每一行运行ufn_GTFO。 – Eric 2012-01-10 18:35:12
@eric - 你是对的,但在本地运行它vs.每行另一个调用与性能角度大不相同。 – 2012-01-11 02:20:53