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()"方法,并且此方法无法转换为存储表达式。
这些是我从其他网站获得的解决方案。现在我该如何解决此错误?
只需在 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)
这样,您可以将string
与string
进行比较
注意:请注意每种格式的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))