在控制器上执行linq查询时,我收到了这个错误:
Opertor' =='不能应用于' int?'类型的操作数。和'字符串'
控制器:
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()'方法,并且此方法无法转换为商店表达式。
这些是我从其他网站获得的解决方案。 现在我该如何解决这个错误?
答案 0 :(得分:1)
首先,当您使用EntityFramework
时,它会尝试将System.String ToString()
方法转换为SQL,但由于无法转换为SQL语句/'store expression'而无法执行此操作。
您应该将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)
答案 1 :(得分:1)
在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;
答案 2 :(得分:1)
考虑使用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?
答案 3 :(得分:0)
您需要获得int?
中的值。为此,您需要使用.Value
,但在需要检查t.SCAN_STAT
是否具有值以防止参数null异常之前:
(Status == "" || Status == "-1" || (t.SCAN_STAT.HasValue && t.SCAN_STAT.Value.ToString() == Status))