如果 char(2) 的列具有两个空格的默认值,则 Linq 引用不返回任何项目

Posted

技术标签:

【中文标题】如果 char(2) 的列具有两个空格的默认值,则 Linq 引用不返回任何项目【英文标题】:Linq quote returns no items if column of char(2) has default value of two spaces 【发布时间】:2014-03-31 20:44:53 【问题描述】:

我有一个 ProdFinSize 表,其中包含 RangeColorModelScaleSizeRiseInseam 列以及 @987654330 的数据类型@列为char(2),默认值为两个空格。

我编写了这个 SQL 查询来测试我想要的结果。

SELECT * 
FROM ProdFinSize
WHERE Range = '020' 
  and Color = '05' 
  and Model = 'JU' 
  and Scale = '1' 
  and Size = '34' 
  and Rise = 'R' 
  and inseam = '';

当我执行此操作时,它会返回一个应有的项目。

接下来,我在 ASP.NET WebAPI 中使用 LINQ to Entities 实现了同样的功能

这是我的 api 函数调用

// GET /api/inventory/stockcheck
[Route("CheckStock")]
[HttpGet]
public IHttpActionResult CheckStock(string range, string color, string model, string scale,
                                                 string size, string rise, string inseam = "")

    try
    
        ProdFinSize product = null;                       
        product = berle.ProdFinSizes.Single(
            item =>
            item.Range == range &&
            item.Color == color &&
            item.Model == model &&
            item.Scale == scale &&
            item.Size == size &&                        
            item.Rise == rise &&
            item.Inseam == inseam
        );          

        // check if we found a matching product
        if (product != null)
                         
            // see if the item is in-stock
            var available = (product.FinSzOnHand-product.FinSzAloc-product.FinSzRlsd) > 0;
            return Ok(available.ToString());
        
            return Ok("False");
                   
        catch(Exception e)
        
            return Ok(e.Message);
            //return Ok("Item not found");
         
     

现在,当我进行 api 调用并传递我在 SQL 查询中使用的相同值时,它会返回一条消息:Sequence Contains No Elements

谁能告诉我我缺少什么以及为什么 LINQ to Entities 中的相同查询没有返回单个结果,因为它应该返回?

我是 LINQ to Entities 的新手,所以我不确定我是否做错了什么。

请注意,我无法更改数据库表中的任何列或列数据类型。

当我运行 SQL Profiler 时,会执行下面的查询。

exec sp_executesql N'SELECT TOP (2) 
    [Extent1].[CompanyCode] AS [CompanyCode], 
    [Extent1].[Range] AS [Range], 
    [Extent1].[Color] AS [Color], 
    [Extent1].[Model] AS [Model], 
    [Extent1].[Scale] AS [Scale], 
    [Extent1].[Inseam] AS [Inseam], 
    [Extent1].[Size] AS [Size], 
    [Extent1].[Rise] AS [Rise], 
    [Extent1].[FinSzProd] AS [FinSzProd], 
    [Extent1].[FinSzOnHand] AS [FinSzOnHand], 
    [Extent1].[FinSzXfrIn] AS [FinSzXfrIn], 
    [Extent1].[FinSzXfrOut] AS [FinSzXfrOut], 
    [Extent1].[FinSzRetn] AS [FinSzRetn], 
    [Extent1].[FinSzShip] AS [FinSzShip], 
    [Extent1].[FinSzRsrvd] AS [FinSzRsrvd], 
    [Extent1].[FinSzRlsd] AS [FinSzRlsd], 
    [Extent1].[FinSzAloc] AS [FinSzAloc], 
    [Extent1].[DateTimeStamp] AS [DateTimeStamp], 
    [Extent1].[FormID] AS [FormID], 
    [Extent1].[UserID] AS [UserID], 
    [Extent1].[rowguid] AS [rowguid]
    FROM (SELECT 
    [ProdFinSize].[CompanyCode] AS [CompanyCode], 
    [ProdFinSize].[Range] AS [Range], 
    [ProdFinSize].[Color] AS [Color], 
    [ProdFinSize].[Model] AS [Model], 
    [ProdFinSize].[Scale] AS [Scale], 
    [ProdFinSize].[Inseam] AS [Inseam], 
    [ProdFinSize].[Size] AS [Size], 
    [ProdFinSize].[Rise] AS [Rise], 
    [ProdFinSize].[FinSzProd] AS [FinSzProd], 
    [ProdFinSize].[FinSzOnHand] AS [FinSzOnHand], 
    [ProdFinSize].[FinSzXfrIn] AS [FinSzXfrIn], 
    [ProdFinSize].[FinSzXfrOut] AS [FinSzXfrOut], 
    [ProdFinSize].[FinSzRetn] AS [FinSzRetn], 
    [ProdFinSize].[FinSzShip] AS [FinSzShip], 
    [ProdFinSize].[FinSzRsrvd] AS [FinSzRsrvd], 
    [ProdFinSize].[FinSzRlsd] AS [FinSzRlsd], 
    [ProdFinSize].[FinSzAloc] AS [FinSzAloc], 
    [ProdFinSize].[DateTimeStamp] AS [DateTimeStamp], 
    [ProdFinSize].[FormID] AS [FormID], 
    [ProdFinSize].[UserID] AS [UserID], 
    [ProdFinSize].[rowguid] AS [rowguid]
    FROM [dbo].[ProdFinSize] AS [ProdFinSize]) AS [Extent1]
    WHERE ([Extent1].[Range] = @p__linq__0) AND (@p__linq__0 IS NOT NULL) AND ([Extent1].[Color] = @p__linq__1) AND (@p__linq__1 IS NOT NULL) AND ([Extent1].[Model] = @p__linq__2) AND (@p__linq__2 IS NOT NULL) AND ([Extent1].[Scale] = @p__linq__3) AND (@p__linq__3 IS NOT NULL) AND ([Extent1].[Size] = @p__linq__4) AND (@p__linq__4 IS NOT NULL) AND ([Extent1].[Rise] = @p__linq__5) AND (@p__linq__5 IS NOT NULL) AND ([Extent1].[Inseam] = @p__linq__6) AND (@p__linq__6 IS NOT NULL)',N'@p__linq__0 varchar(8000),@p__linq__1 varchar(8000),@p__linq__2 varchar(8000),@p__linq__3 varchar(8000),@p__linq__4 varchar(8000),@p__linq__5 varchar(8000),@p__linq__6 varchar(8000)',@p__linq__0='020',@p__linq__1='05',@p__linq__2='JU',@p__linq__3='1',@p__linq__4='34',@p__linq__5='R',@p__linq__6=NULL

【问题讨论】:

Run the Sql Profiler 查看正在执行的查询。 一条评论...数据库通常不区分大小写。您确定这里没有简单的大小写问题吗? 您可能需要在 char 类型的列上调用 .Trim() 以确保您没有比较填充字符串。 也许您也应该发布数据...有些简单的不匹配... 看一下SQL的编辑:你传递的是参数赋值@p__linq__6=NULL。这与WHERE 子句中的条件@p__linq__6 IS NOT NULL 冲突。您可以尝试将方法调用中“inseam”参数的默认值更改为" "(两个空格)。 【参考方案1】:

参数inseam的默认值是“”而不是“”(两个空格)

【讨论】:

以上是关于如果 char(2) 的列具有两个空格的默认值,则 Linq 引用不返回任何项目的主要内容,如果未能解决你的问题,请参考以下文章

如何将具有数字值的 char 数据类型的列转换为数字数据类型

如何找到所有具有 CHAR 数据类型的列并在其中具有数值的表?

如果源文件中不存在,ssis 添加具有默认值的列

如何使具有重复值的列紧贴在一起,而其他值在它们之间留出空格

t-sql 如果记录存在则选择一列,如果不存在则选择不同的列

char的默认值据说是'\u0000',但我在java中得到了输出空格字符('')[重复]