如果 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
表,其中包含 Range
、Color
、Model
、Scale
、Size
、Rise
、Inseam
列以及 @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 数据类型的列并在其中具有数值的表?