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”
我尝试了很多不同的方法,但我只是不知道如何解决它。
用这个:
list.Select(p => p.secondID).Cast<int?>().Contains(b.firstID);
您遇到了问题,因为list.Select(p => p.secondID)will 是 an IEnumerable<int?,但由于 firstID 是int(不可为空的),重载决议无法确定有效的包含要调用的重载。您不能从 隐式转换IEnumerable<int?>为IEnumerable<int>。Cast 扩展方法通过将每个元素转换为 int 来工作。
正如另一个答案中提到的,您也可以简单地将不可为空的 int 传入包含:
list.Select(p => p.secondID).Contains(b.firstID ?? 0);
但是,请注意这可能不是我们想要的。如果第一个列表包含0,并且firstID为空,则结果将为真,因为当值为空时传入 0。当firstID为空时,表达式的 Cast 版本返回假。