linq查询其中int ID属于List <int> </int>

时间:2010-01-20 02:55:04

标签: c# linq list

我遇到了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;  

有什么想法吗?

任何帮助表示赞赏,
感谢

3 个答案:

答案 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;  
相关问题