我遇到了linq查询的问题。我以前用过类似的东西,但我现在无法理解可能出现的问题。
错误
最佳重载方法匹配 'System.Collections.Generic.List.Contains(INT)' 有一些无效的论点
参数'1':无法从'int?'转换'int';是指rTestResults的where子句
代码:
List<int> rMTCPlates = (from rP in mDataContext.Plates
where rP.SOItem.SONumberID == aSONumber
select rP.ID).ToList();
var rTestResults = from rT in mDataContext.TestSamplesViews
where rMTCPlates.Contains(rT.PlateID)
select rT;
有什么想法吗?
任何帮助表示赞赏,
感谢
答案 0 :(得分:21)
您可以在此处使用null-coalescing operator:
var rTestResults = from rT in mDataContext.TestSamplesViews
where rMTCPlates.Contains(rT.PlateID ?? 0)
select rT;
答案 1 :(得分:6)
那是因为ID字段可以为空,而集合中的项目则不是。
您可能忘记在数据库中将其标记为非null,以便设计人员以这种方式生成它。
DB中的最佳标记不是空并刷新数据。
此外,U没有指定你正在使用哪个LINQ,假设您使用linq数据库,我不确定Contains扩展方法在Linq to Sql或Linq to Entities中是否有效,您可能会得到另一个NotSupportedException即使你修好了上述内容。
因此,要么使用两个查询,第一个用于访问数据库,第二个用于从已加载的集合中检索值,或者考虑使用'Contains()' workaround using Linq to Entities?。
如果你正在使用linq-to对象而你并不关心上面描述的所有垃圾,请使用以下内容:
var rTestResults = from rT in mDataContext.TestSamplesViews
where rT.PlateID.HasValue &&
rMTCPlates.Contains(rT.PlateID.Value)
select rT.Value;
答案 2 :(得分:2)
由于System.Collections.Generic.List.Contains(int)
上的例外我可以猜到mDataContext.TestSamplesViews.PlateID
可以为空。
如果你只是想要一个easyquick修复,和/或你不能改变PlateID
所以它不再可以为空,你可以先检查它是否有值:
var rTestResults = from rT in mDataContext.TestSamplesViews
where (rT.PlateID.HasValue && rMTCPlates.Contains(rT.PlateID))
select rT;