C# 如何为转换后的SQL查询找到等效的Linq命令
我有一个以Guid作为主键的表和多个nvarcharmax列: 及 我对另一张桌子也有同样的问题C# 如何为转换后的SQL查询找到等效的Linq命令,c#,sql-server,linq,entity-framework-core,C#,Sql Server,Linq,Entity Framework Core,我有一个以Guid作为主键的表和多个nvarcharmax列: 及 我对另一张桌子也有同样的问题 public class Document : IEntityKey<Guid> { public Document() { } public Guid Id { get; set; } [StringLength(500)] public string Name { get; set; } public byte[] Data { get;
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; }
}
及
正如您所看到的,数据列在转换后的查询中很奇怪。
这些查询很慢,我应该对它们进行调优,但我无法在C代码中找到它们的起源。因此,我正在寻找等效的翻译Linq命令。请你给我介绍一下:
什么是等效Linq?
为什么nvarcharmax转换为两列DATALENGTH[说明],
[说明]?
为什么字节[]在DATALENGTH[Data]>=4116480,然后DATALENGTH 0x2142494E5F46494C45213A+将newid转换为VARCHAR 100作为VARBINARY 100,否则DATALENGTH[Data]结束,在DATALENGTH[Data]>=4116480,然后0x2142494E5F46494C45213A+将newid转换为VARCHAR 100作为VARBINARY 100,否则DATALENGTH[Data]结束?
在我们的环境中,我们还看到了一个类似的奇怪而缓慢的查询,该查询具有相同的奇怪常量0x2142494E5F46494C45213A。这是由数据层应用程序包DACPAC导出引起的。更好的是,取消作业不会终止查询,但终止SSM会停止查询。在POCO的配置中,您是否告诉EF字段的类型为NVARCHAR?如果你不这样做,EF可能会尝试在幕后进行一些奇怪的转换。拆分的原因是EF需要长度信息。使用完整表定义架构和完整查询更新您的问题,而不使用。。。!以及相关的POCO
public partial class Table : INamedEntity, IEntityKey<Guid>
{
public Guid Id { get; set; }
private Table() { }
public string Name { get; set; }
public string Description { get; set; }
}
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