Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linq to sql 具有提取接口的LinqToSql DataContext不';t为函数编写SQL_Linq To Sql - Fatal编程技术网

Linq to sql 具有提取接口的LinqToSql DataContext不';t为函数编写SQL

Linq to sql 具有提取接口的LinqToSql DataContext不';t为函数编写SQL,linq-to-sql,Linq To Sql,我已设置测试数据库和控制台应用程序,以确认以下内容: 给定具有以下功能的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 compu

我已设置测试数据库和控制台应用程序,以确认以下内容:

给定具有以下功能的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#:

转换为以下SQL:

SELECT [t0].[PKey], [dbo].[ufn_GTFO]([t0].[WFT]) AS [GTFO] FROM [dbo].[Test] AS [t0]
但是,如果我在DataContext上使用refactor->extract接口,并使用该接口的实例:

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和为接口方法生成的IL,它们的不同之处仅在于对接口的引用和编译器生成的显示类似乎与结果没有任何关系。

linq to sql严重依赖映射类的属性(datacontext)成员到数据库成员。您的接口可能没有ufn_GRFO方法上的FunctionAttribute。如果没有这个属性,C#world和SQL函数之间的链接就会中断;然而。您的接口也没有使用DatabaseAttribute进行修饰,因为该属性仅对类有效,而对接口无效。如果没有这个属性,你就切断了C#和整个数据库之间的链接。默认情况下,Linq使用AttributeMappingSource在DataContext中映射类型成员。如果接口是有问题的类型,并且该类型已断开与该数据库的链接,则由于无法将数据库属性应用于该接口,默认映射源将不会将函数ufn_GRFO映射到数据库函数,而linq会将其视为.NET函数,用WFT字段中的数据调用

我怀疑解决这个问题的方法是为datacontext提供一个自定义MappingSource实现,忽略DatabaseAttribute,只考虑属性上的属性


我不会对此给出答案,因为我从LINQ的角度不知道,但我知道SQL Server也会在第一次查询中为每一行运行一次
ufn\u GTFO
。@eric-你是对的,但是在本地运行它与在每一行中进行另一次调用相比,从性能的角度看是大不相同的。
SELECT [t0].[PKey], [t0].[WFT] AS [guid]
FROM [dbo].[Test] AS [t0]