Opertor' =='不能应用于' int?'类型的操作数。和'字符串' on where where

时间:2016-02-19 08:31:54

标签: c# entity-framework linq asp.net-mvc-4

在控制器上执行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()'方法,并且此方法无法转换为商店表达式。

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

4 个答案:

答案 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)

这样,您可以将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?

进行比较

答案 3 :(得分:0)

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

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