2009-03-25 3 views
4

Для той или иной причине Linq2SQL генерирует следующее 1 из моих таблиц для удаления:Weird Select/Удалить поколение запросов в 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.

Теперь это никак не влияет на запрос/поведение, меня просто интересует, что происходит здесь.

UPDATE:

Tag является базовым классом для Linq2SQL наследования. По-видимому, дополнительными параметрами являются целые значения дискриминатора (Тип) всех унаследованных типов. Если я удаляю унаследованные типы, дополнительные параметры снижаются.

UPDATE 2:

Я заметил это происходит из-за слишком ВЫБРАТЬ.

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.

UPDATE 3

Теперь я бегу SQL Profiler, и я вижу следующее, и это очень беспокоит :(

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 

Благодаря

leppie

+0

Не могли бы вы PLS показать запрос Linq, создавший это утверждение. – irperez

+0

Нет, я не могу. Это делается в целом. это просто DataContext.GetTable (e.GetRootType()). УдалитьOnSubmit (e). GetRootType просто получает тип корневой таблицы иерархии. – leppie

+1

Вы должны опубликовать свое обновление в качестве ответа и отметить этот вопрос как ответ –

ответ

2

Это звучит как ошибка где-то в Linq2Sql. Я думаю, что дополнительные параметры не должны генерироваться.

Я думаю, вы должны указать ошибку на Microsoft Connect на этом.

0

Очень интересно - похоже, он не мог решить, может ли он использовать первичный ключ или нет ... что делает объект mod Эл выглядит? Никакое наследование на руку или что-нибудь еще?

+0

Хехе, где было бы весело, если бы не было ручной работы? Я делаю реорганизацию БД в наследование L2S, чтобы сократить ненужные таблицы. – leppie

0

Вы передали перечислимую коллекцию вместо скалярного значения для параметра, который преобразуется в @ p1?

+0

Проблема, поскольку я вижу, что LINQ-to-SQL делает это за кулисами через DeleteOnSubmit; вы даете ему экземпляр объекта (Клиент и т. д.) - не значения. –

+0

@ p1 - это перечисление, полученное из байта. Таким образом, одно значение. – leppie

+1

Имеет ли список «случайных значений» какой-либо случайный список всех возможных значений этого перечисления? – BlueMonkMN

0

Является ли TagId основным в свойствах конструктора DBML? Чтобы проверить, откройте файл DBML, щелкните свойство TagId класса Tag и просмотрите свойства.

+1

Да, это так, иначе это не сработало бы вообще :) – leppie

0

Удалите файл dbml из проекта, перезапустите визуальную студию и восстановите файл dbml. Иногда визуальная студия кэширует старые версии вашей таблицы sql или схемы хранимых процедур. Это может помочь linq правильно обработать sql.

+1

Нет, проблема не имеет ничего общего с самим SQL. Это производные классы, использующие свойство дискриминатора. – leppie

0

Задумывались ли вы о том, чтобы заглянуть в исходный код рамки и отладить сценарий самостоятельно?

Поскольку источник для.NET Framework, наконец, доступна это довольно легко достичь :)

Ссылка: Configuring Visual Studio to Debug .NET Framework Source Code

+0

К сожалению, код не доступен для System.Data.Linq :( – leppie

+0

Странно .. он загружает символы для этой DLL, но, как вы говорите, я не могу прыгнуть в исходный код. – VVS

Смежные вопросы