我能够让我的方法(如下)在 LinqPad 中运行,但是当切换到我的实际代码(使用实体框架)时,我收到了这个错误:
“无法将类型 'System.Nullable`1' 转换为类型 'System.Object'。LINQ to Entities 仅支持转换 EDM 基元或枚举类型。”
如果我在此处取消注释两个注释行中的任何一个,则会发生错误(实际错误直到方法中的最后一行运行后才会发生):
public List<LotEquipmentScan> GetLotEquipmentScans(string maximoAssetNumber, decimal? manufacturerId, decimal? partNumber)
{
var predicate = PredicateBuilder.True<LotEquipmentScanRecord>();
// Note: Can't use == in where clause because of the possibility of nulls. That's why we're using object.Equals().
if (maximoAssetNumber != "x") { predicate = predicate.And(scan => object.Equals(scan.MaximoAssetNumber, maximoAssetNumber)); }
//if (manufacturerId != -1) { predicate = predicate.And(scan => object.Equals(scan.RawMaterialLabel.ManufacturerId, manufacturerId)); }
//if (partNumber != -1) { predicate = predicate.And(scan => object.Equals(scan.RawMaterialLabel.PartNumber, partNumber)); }
return Db.LotEquipmentScanRecords.AsExpandable().Where(predicate).ToList().Map();
}
我相信这是因为manufacturerId 和partNumber 是可以为空的小数。问题是这些变量可以为空,我们甚至希望通过它们为空来过滤结果。这只是不适用于 EF,还是有一种优雅的方法来解决这个问题?
编辑
需要明确的是,当manufacturerId 作为null 传入时,使用此行会返回五行(我可以通过查看数据库来验证):
if (manufacturerId != -1) { predicate = predicate.And(scan => object.Equals(scan.RawMaterialLabel.ManufacturerId, manufacturerId)); }
使用这一行,不会返回任何行:
if (manufacturerId != -1) { predicate = predicate.And(scan => scan.RawMaterialLabel.ManufacturerId == manufacturerId); }
问题是当我传入一个好的制造商 ID 时,我得到了上面的错误。