【问题标题】:Weird Select/Delete query generation in Linq2SQLLinq2SQL 中奇怪的选择/删除查询生成
【发布时间】:2010-10-15 10:17:19
【问题描述】:

出于某种或其他原因,Linq2SQL 在我的一张表上生成以下内容以进行删除:

DELETE FROM [dbo].[Tag] WHERE ([TagId] = @p0) AND ([Type] = @p1)
-- @p0: Input UniqueIdentifier (Size = 0; Prec = 0; Scale = 0) 
                               [fb538481-562d-45f2-bb33-3296cd7d0b28]
-- @p1: Input TinyInt (Size = 1; Prec = 0; Scale = 0) [1]
-- @p2: Input TinyInt (Size = 1; Prec = 0; Scale = 0) [0]
-- @p3: Input TinyInt (Size = 1; Prec = 0; Scale = 0) [7]
-- @p4: Input TinyInt (Size = 1; Prec = 0; Scale = 0) [5]
-- @p5: Input TinyInt (Size = 1; Prec = 0; Scale = 0) [8]
-- @p6: Input TinyInt (Size = 1; Prec = 0; Scale = 0) [4]
-- @p7: Input TinyInt (Size = 1; Prec = 0; Scale = 0) [3]
-- @p8: Input TinyInt (Size = 1; Prec = 0; Scale = 0) [9]
-- @p9: Input TinyInt (Size = 1; Prec = 0; Scale = 0) [6]
-- @p10: Input TinyInt (Size = 1; Prec = 0; Scale = 0) [1]
-- @p11: Input TinyInt (Size = 1; Prec = 0; Scale = 0) [2]
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel 
      Build: 3.5.30729.1

如您所见,前 2 个参数(@p0 和 @p1)是正确的,但随后它会生成一个从 0 到 9 的唯一数字的随机集合。

现在这不会以任何方式影响查询/行为,我只是对这里发生的事情感兴趣。

更新:

Tag 是 Linq2SQL 继承的基类。似乎额外的参数是所有继承类型的鉴别器(类型)的整数值。如果我删除继承的类型,额外的参数就会减少。

更新 2:

我注意到 SELECT 也会发生这种情况。

SELECT 
    (CASE 
        WHEN EXISTS(
            SELECT NULL AS [EMPTY]
            FROM [Tag] AS [t0]
            WHERE ([t0].[TagId] = @p0) AND ([t0].[TagType] = @p1)
            ) THEN 1
        ELSE 0
     END) AS [value]
-- @p0: Input Guid (Size = 0; Prec = 0; Scale = 0) 
                   [60000000-0000-0000-0000-fe0000000025]
-- @p1: Input Byte (Size = 0; Prec = 0; Scale = 0) [25]
-- @p2: Input Byte (Size = 0; Prec = 0; Scale = 0) [0]
-- @p3: Input Byte (Size = 0; Prec = 0; Scale = 0) [10]
-- @p4: Input Byte (Size = 0; Prec = 0; Scale = 0) [28]
-- @p5: Input Byte (Size = 0; Prec = 0; Scale = 0) [13]
-- @p6: Input Byte (Size = 0; Prec = 0; Scale = 0) [27]
-- @p7: Input Byte (Size = 0; Prec = 0; Scale = 0) [1]
-- @p8: Input Byte (Size = 0; Prec = 0; Scale = 0) [2]
-- @p9: Input Byte (Size = 0; Prec = 0; Scale = 0) [3]
-- @p10: Input Byte (Size = 0; Prec = 0; Scale = 0) [4]
-- @p11: Input Byte (Size = 0; Prec = 0; Scale = 0) [5]
-- @p12: Input Byte (Size = 0; Prec = 0; Scale = 0) [6]
-- @p13: Input Byte (Size = 0; Prec = 0; Scale = 0) [7]
-- @p14: Input Byte (Size = 0; Prec = 0; Scale = 0) [8]
-- @p15: Input Byte (Size = 0; Prec = 0; Scale = 0) [9]
-- @p16: Input Byte (Size = 0; Prec = 0; Scale = 0) [11]
-- @p17: Input Byte (Size = 0; Prec = 0; Scale = 0) [12]
-- @p18: Input Byte (Size = 0; Prec = 0; Scale = 0) [14]
-- @p19: Input Byte (Size = 0; Prec = 0; Scale = 0) [15]
-- @p20: Input Byte (Size = 0; Prec = 0; Scale = 0) [16]
-- @p21: Input Byte (Size = 0; Prec = 0; Scale = 0) [17]
-- @p22: Input Byte (Size = 0; Prec = 0; Scale = 0) [18]
-- @p23: Input Byte (Size = 0; Prec = 0; Scale = 0) [19]
-- @p24: Input Byte (Size = 0; Prec = 0; Scale = 0) [20]
-- @p25: Input Byte (Size = 0; Prec = 0; Scale = 0) [21]
-- @p26: Input Byte (Size = 0; Prec = 0; Scale = 0) [22]
-- @p27: Input Byte (Size = 0; Prec = 0; Scale = 0) [23]
-- @p28: Input Byte (Size = 0; Prec = 0; Scale = 0) [24]
-- @p29: Input Byte (Size = 0; Prec = 0; Scale = 0) [26]
-- Context: SqlProvider(SqlCE) Model: AttributedMetaModel 
      Build: 3.5.30729.1

请注意。根据 MS 示例,我使用枚举作为鉴别器。

更新 3

现在我正在运行 SQL 分析器,我看到以下内容,这非常令人担忧:(

exec sp_executesql N'SELECT 
    (CASE 
        WHEN EXISTS(
            SELECT NULL AS [EMPTY]
            FROM [Tag] AS [t0]
            WHERE ([t0].[TagId] = @p0) AND ([t0].[TagType] = @p1)
            ) THEN 1
        ELSE 0
     END) AS [value]',
N'@p0 uniqueidentifier,
@p1 tinyint,
@p2 tinyint,
@p3 tinyint,
@p4 tinyint,
@p5 tinyint,
@p6 tinyint,
@p7 tinyint,
@p8 tinyint,
@p9 tinyint,
@p10 tinyint,
@p11 tinyint,
@p12 tinyint,
@p13 tinyint,
@p14 tinyint,
@p15 tinyint,
@p16 tinyint,
@p17 tinyint,
@p18 tinyint,
@p19 tinyint,
@p20 tinyint,
@p21 tinyint,
@p22 tinyint,
@p23 tinyint,
@p24 tinyint,
@p25 tinyint,
@p26 tinyint,
@p27 tinyint,
@p28 tinyint,
@p29 tinyint,
@p30 tinyint,
@p31 tinyint,
@p32 tinyint',
@p0='60000000-0000-0000-0000-FE0000000025',
@p1=25,@p2=0,@p3=23,@p4=29,@p5=31,@p6=16,@p7=14,@p8=1,@p9=2,
@p10=3,@p11=4,@p12=5,@p13=6,@p14=7,@p15=8,@p16=9,@p17=10,@p18=11,
@p19=12,@p20=13,@p21=22,@p22=15,@p23=17,@p24=18,@p25=19,@p26=20,
@p27=21,@p28=27,@p29=24,@p30=26,@p31=30,@p32=28

谢谢

雷比

【问题讨论】:

  • 能否请您显示生成此语句的 linq 查询。
  • 不,我不能。它是通用的。很简单,DataContext.GetTable(e.GetRootType()).DeleteOnSubmit(e)。 GetRootType 只是获取层次结构的根表类型。
  • 您应该将更新发布为答案并将此问题标记为已回答
  • 嗯,蒂姆,没有人回答...我发现了另一个问题。

标签: c# .net linq-to-sql inheritance


【解决方案1】:

非常有趣 - 看起来它无法决定是否可以使用主键......对象模型是什么样的?没有手工继承什么的?

【讨论】:

  • 呵呵,如果没有手工制作,还有什么乐趣呢?我正在将 DB 重构为 L2S 继承,以减少不必要的表。
【解决方案2】:

您是否为转换为@p1 的参数传递了可枚举集合而不是标量值?

【讨论】:

  • 我看到的问题是 LINQ-to-SQL 通过 DeleteOnSubmit 在幕后完成所有这些工作;你给它一个对象实例(客户等) - 而不是值。
  • @p1 是从字节派生的枚举。如此单一的价值。
  • “随机值”列表是否代表该枚举的所有可能值?
【解决方案3】:

是否在 DBML 设计器属性中将 TagId 标记为您的主键?要检查,请打开 DBML 文件,单击 Tag 类的 TagId 属性并查看属性。

【讨论】:

    【解决方案4】:

    请从项目中删除 dbml 文件,重新启动 Visual Studio 并重建 dbml 文件。有时,Visual Studio 会缓存旧版本的 sql 表或存储过程架构。这可能有助于 linq 正确处理 sql。

    【讨论】:

    • 不,这个问题与 SQL 本身无关。这些是使用鉴别器属性的派生类。
    【解决方案5】:

    这听起来像是 Linq2Sql 中的某个错误。我认为不应该生成额外的参数。

    我认为你应该在Microsoft Connect 提交一个错误。

    【讨论】:

      【解决方案6】:

      有没有想过自己偷窥框架源码并调试场景?

      由于 .NET Framework 的源代码终于可用,这很容易实现 :)

      链接:Configuring Visual Studio to Debug .NET Framework Source Code

      【讨论】:

      • 奇怪.. 它加载了该 DLL 的符号,但正如你所说,我无法跳入源代码。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多