Как найти эквивалентную команду Linq для переведенного запроса SQL - PullRequest
0 голосов
/ 28 мая 2020

У меня есть таблица с Guid в качестве первичного ключа и несколькими nvarchar(max) столбцами:

CREATE TABLE [dbo].[Tables](
[Id] [uniqueidentifier] NOT NULL,
[Name] [nvarchar](max) NOT NULL,
[Description] [nvarchar](max) NULL,
CONSTRAINT [PK_Table] PRIMARY KEY CLUSTERED 
([Id] ASC)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

и

public partial class Table : INamedEntity, IEntityKey<Guid>
{
    public Guid Id { get; set; }

    private Table() { }

    public string Name { get; set; }

    public string Description { get; set; }
}

, который переведен на этот запрос в SQL Server:

    SELECT   [Id], DATALENGTH([Description]), [Description] , DATALENGTH([Name]), [Name] 
    FROM     [dbo].[Table]
    WHERE    [Id] < @UpperBound
    ORDER BY [Id] ASC

У меня такая же проблема с другой таблицей с

public class Document : IEntityKey<Guid>
{
    public Document() { }

    public Guid Id { get; set; }

    [StringLength(500)]
    public string Name { get; set; }

    public byte[] Data { get; set; }

    [StringLength(10)]
    public string Extension { get; set; }
}

и

(@UpperBound uniqueidentifier)
SELECT   [Id],  CASE WHEN DATALENGTH([Data]) >= 4116480 THEN DATALENGTH(0x2142494E5F46494C45213A + CAST (CAST (newid() AS VARCHAR (100)) AS VARBINARY (100))) ELSE DATALENGTH([Data]) END, CASE WHEN DATALENGTH([Data]) >= 4116480 THEN 0x2142494E5F46494C45213A + CAST (CAST (newid() AS VARCHAR (100)) AS VARBINARY (100)) ELSE [Data] END, [Name],[Extension]  FROM [dbo].[Documents]  
    WHERE    [Id] < @UpperBound 
    ORDER BY [Id] ASC

Как видите, столбец Data странный в переведенный запрос. Эти запросы медленные, и мне нужно их настроить, но я не могу найти их происхождение в коде C#. Поэтому я ищу эквивалентную переведенную команду Linq. Не могли бы вы рассказать мне о:

  1. Что эквивалентно Linq?
  2. Почему nvarchar(max) переведено в две колонки DATALENGTH([Description]), [Description]?
  3. Почему byte[] переведено на CASE WHEN DATALENGTH([Data]) >= 4116480 THEN DATALENGTH(0x2142494E5F46494C45213A + CAST (CAST (newid() AS VARCHAR (100)) AS VARBINARY (100))) ELSE DATALENGTH([Data]) END, CASE WHEN DATALENGTH([Data]) >= 4116480 THEN 0x2142494E5F46494C45213A + CAST (CAST (newid() AS VARCHAR (100)) AS VARBINARY (100)) ELSE [Data] END?

1 Ответ

1 голос
/ 11 июня 2020

В нашей среде мы также видели похожий странный и медленный запрос с той же странной константой 0x2142494E5F46494C45213A. Это было вызвано экспортом пакета приложения уровня данных (DACPA C). Еще лучше было то, что отмена задания не уничтожила запрос, а отключение SSMS остановило его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...