无法从'System.Collections.Generic.IEnumerable <int>'转换为'System.Collections.Generic.IEnumerable <int?>'</int?> </int>

时间:2011-01-08 13:37:08

标签: c# linq

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'

我尝试了很多不同的方法,但我只是不知道如何解决它。

2 个答案:

答案 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);