Opertor '==' 不能应用于 where 子句上类型为 'int?' 和 

本文关键字:int 类型 where 不能 应用于 Opertor 子句 | 更新日期: 2023-09-27 18:35:17

在控制器上执行下面的linq查询时,我收到此错误:

Opertor '==' 不能应用于类型为 'int?' 和 'string' 的操作数

控制器:

from t in db.ASN_ITEM
    join t0 in db.ITEM_MASTER on t.ITEM_MASTER.ITEM_CODE equals t0.ITEM_CODE        
    where
         t.REGION_ID == RegionId && 
         (Status == "" || Status == "-1" || t.SCAN_STAT == Status)

这里t.SCAN_STAT类型int?,变量status类型string

我试过这个:

(Status == "" || Status == "-1" || SqlFunctions.StringConvert((double)t.SCAN_STAT) == Status)

但不根据条件获取所需的数据。

当我尝试(Status == "" || Status == "-1" || t.SCAN_STAT.ToString() == Status)时,我收到此错误:

LINQ to Entities 无法识别方法"System.String ToString()"方法,并且此方法无法转换为存储表达式。

这些是我从其他网站获得的解决方案。现在我该如何解决此错误?

Opertor '==' 不能应用于 where 子句上类型为 'int?' 和 

只需在 linq 查询之前将 Status 转换为 int,然后在查询中将其用作 int:

var intStatus = (int)null;
int.TryParse(Status,out intStatus);
from t in db.ASN_ITEM
    join t0 in db.ITEM_MASTER on t.ITEM_MASTER.ITEM_CODE equals t0.ITEM_CODE        
    where
         t.REGION_ID == RegionId && 
         (intStatus == null || intStatus == -1 || t.SCAN_STAT == intStatus;

首先,当您使用 EntityFramework 时,它将尝试将 System.String ToString() 方法转换为 SQL,但由于无法转换为 SQL 语句/"存储表达式",因此无法执行此操作。

您应该将 ToString() 方法移出存储表达式。为此,您可以首先使用 ToList() 或 ToEumerable() 方法执行 EF 表达式。然后在该(Status == "" || Status == "-1" || t.SCAN_STAT == Status)'上使用您的条件

或者你也可以试试这个:

from t in db.ASN_ITEM
join t0 in db.ITEM_MASTER on t.ITEM_MASTER.ITEM_CODE equals t0.ITEM_CODE        
let SCAN_STAT = t.SCAN_STAT.ToString()
where
     t.REGION_ID == RegionId && 
     (Status == "" || Status == "-1" || SCAN_STAT == Status)

考虑使用 LINQ let 创建中间变量进行检查:

from t in db.ASN_ITEM
join t0 in db.ITEM_MASTER on t.ITEM_MASTER.ITEM_CODE equals t0.ITEM_CODE        
let test = t.SCAN_STAT.ToString()
where
     t.REGION_ID == RegionId && 
     (Status == "" || Status == "-1" || test == Status)

这样,您可以将stringstring进行比较

注意:请注意每种格式的string格式。如果需要,您甚至可以确保它们具有相同的格式,例如:

from t in db.ASN_ITEM
join t0 in db.ITEM_MASTER on t.ITEM_MASTER.ITEM_CODE equals t0.ITEM_CODE        
let test = t.SCAN_STAT.ToString().ToUpper().Trim()
let test2 = Status.ToUpper().Trim()
where
     t.REGION_ID == RegionId && 
     (Status == "" || Status == "-1" || test == test2)

或者,您也可以执行相反的操作:

int? test = string.IsNullOrWhiteSpace(Status) ? null : Convert.ToInt32(Status); //or, adjust the null as you wish

然后像这样使用它:

from t in db.ASN_ITEM
join t0 in db.ITEM_MASTER on t.ITEM_MASTER.ITEM_CODE equals t0.ITEM_CODE        
where
     t.REGION_ID == RegionId && 
     (Status == "" || Status == "-1" || t.SCAN_STAT == test)

这样,您可以将int?int?进行比较

您需要

int?中获取值。为此,您需要使用 .Value 但在您需要检查t.SCAN_STAT是否有值以防止参数 null 异常之前:

(Status == "" || Status == "-1" || (t.SCAN_STAT.HasValue && t.SCAN_STAT.Value.ToString() == Status))