class first
{
private int? firstID;
}
class second
{
private int secondID;
private int secondField;
}
public override Expression<Func<first, bool>> FirstFilter()
{
Contex db = new Contex();
List<second> list = (from p in db.second select p).ToList();
return b => list.Select(p => p.secondID).Contains(b.firstID);
}
我有错误:
无法从'System.Collections.Generic.IEnumerable'转换为'System.Collections.Generic.IEnumerable'
我尝试了很多不同的方法,但我只是不知道如何解决它。
答案 0 :(得分:4)
使用此:
list.Select(p => p.secondID).Cast<int?>().Contains(b.firstID);
您遇到了问题,因为list.Select(p => p.secondID)
将是IEnumerable<int?
,但由于firstID为int
(不可为空),因此重载解析无法确定要调用的包含的有效重载。您无法隐式地从IEnumerable<int?>
转换为IEnumerable<int>
。 Cast扩展方法通过将每个元素转换为int来工作。
正如另一个答案所提到的,你也可以简单地将一个不可为空的int传递给Contains:
list.Select(p => p.secondID).Contains(b.firstID ?? 0);
但是,请注意这可能不是想要的。如果第一个列表包含0
,并且firstID
为null,则结果为true,因为当值为null时传入0。当{{1}时,表达式的Cast版本返回false是空的。
答案 1 :(得分:0)
尝试为firstID
提供默认值(如果为空:
return b => list.Select(p => p.secondID).Contains(b.firstID ?? 0);