【问题标题】:C# Linq to entity (EF Core) create SQL statement "like '1 %'" : Startswith doesn't work when passed a variableC# Linq to entity (EF Core) create SQL statement "like '1 %'" : Startswith 在传递变量时不起作用
【发布时间】:2021-09-22 16:39:24
【问题描述】:

我正在尝试重新创建以下 SQL 条件:like '1 %'

表中的列包含由空格分隔的两组值。使用StartsWith(glassTag) 返回列以“1”开头的任何行。在测试条件之前,它似乎对字符串进行了修剪。但是,如果我使用StartsWith("1 "),它会返回我期望的行。

我做错了什么?

这是一个 LINQ to Entity 问题。 SqlMethods 不兼容。

以下返回名称为:“119 GL-01”

        var glassTag = "1 ";
        var gItem = await _context.Items.Where(x => x.Name.StartsWith(glassTag) && x.Material.MaterialType.Name.Equals("Glass") && x.JobItems.Any(j => j.Job.Code.Equals(pCode))).ToListAsync();

下面的代码返回我期望的结果

        var gItem = await _context.Items.Where(x => x.Name.StartsWith("1 ") && x.Material.MaterialType.Name.Equals("Glass") && x.JobItems.Any(j => j.Job.Code.Equals(pCode))).ToListAsync();

【问题讨论】:

  • 请使用标签而不是文字来说明您使用的是什么(还要考虑正确的版本)。
  • EF Core 版本,使用的提供程序?一切都很重要,因为这件事是特定于提供者的,并且您可能在提供者中发现了错误。
  • 尝试设置 var glassTag = @"1";
  • @Den - 得到了相同的结果。

标签: linq entity sql-like


【解决方案1】:

StartsWith 根本不适用于在末尾查找空格时传递的变量。

我已经捕获了 EF 正在生成的 sql。

下面的代码在它下面直接生成sql。将变量传递给 StartsWith 条件时,它不使用“like”。它会产生一些不正确的东西。

var gItem = _context.Items.Where(x => x.Name.StartsWith(gd.glasstag + " "));


DECLARE @__glassTag_0 nvarchar(4000) = N'1 ';

SELECT [i].[ItemId], [i].[Name]
FROM [Item] AS [i]
WHERE (@__glassTag_0 = N'') OR ([i].[Name] IS NOT NULL AND (LEFT([i].[Name], LEN(@__glassTag_0)) = @__glassTag_0))

下面的代码生成它下面的sql。请注意,它使用“like”条件。

var gItem = _context.Items.Where(x => x.Name.StartsWith("1 "));


SELECT [i].[ItemId], [i].[Name]
FROM [Item] AS [i]
WHERE [i].[Name] IS NOT NULL AND ([i].[Name] LIKE N'1 %')

所以,我将创建一个存储过程来检索我需要的数据。代码将如下所示:

        var glassTag = gd.glasstag + " ";
        var gItem = await _context.Items.FromSqlRaw($"spItemsByGlassTag '{pCode}', '{glassTag}'").ToListAsync();

【讨论】:

    猜你喜欢
    • 2011-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-08
    • 1970-01-01
    • 2020-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多