LINQ - 无法从ObjectModel列表中获取ID列表

时间:2016-12-07 00:08:29

标签: c# linq

我是LINQ的新手,我一直在互联网上浏览并整天浏览教程。我有一些我认为可行的代码,但它抱怨返回类型。这是我的代码:

// The orgs parameter is a list of all buildings in the entire organization
// I want to retrieve only the IDs of all buildings in a particular region
private IList<int> GetRegionBuildingIDs(int regionId, List<OrgModel> orgs)
{
    var ids = from org in orgs
              where org.regionId == regionId
              select new { id = org.buildingId };
    return (IList<int>)ids;
}

这将返回一个id列表,但它们是匿名类型,并且强制转换不起作用。我得到一个System.InvalidCastException。

我最接近回答我的问题仍然让我感到困惑。 It's hereI tried to follow the answer but my select(org.buildingId) only offers .ToString

所以这是我最近的尝试,但它错了:

private IList<int> GetRegionBuildingIDs(int regionId, List<OrgModel> orgs)
{
    IEnumerable<int> ids = from org in orgs
              where org.regionId == regionId
              select (org.buildingId)._________;  // This should be .ToList
    return (IList<int>)ids;
}

期待在这里获得一些帮助。谢谢。

2 个答案:

答案 0 :(得分:6)

您不需要select new {},您可以直接select

var ids = from org in orgs
          where org.regionId == regionId
          select org.buildingId;

return ids.ToList();

这是因为select new {}使用带有单个int成员的匿名类型,而不是直接返回int值。

您也无法将Linq查询转换为List<T>,因为它们不是List<T>的实例,而是其他内容(一个由{{1}构建的延迟评估的状态机C#语言功能)。

当然,您的代码可以更加简单

yield return

如果您愿意,请制作自己的扩展方法:

 private static IEnumerable<Int32> GetRegionBuildingIds(Int32 regionId, IEnumerable<OrgModel> orgs) {

    return orgs
        .Where( org => org.regionId == regionId )
        .Select( org => org.buildingId );
}

像这样使用:

public static IEnumerable<Int32> GetRegionBuildingIds(this IEnumerable<OrgModel> orgs, Int32 forRegionId) {

    return orgs
        .Where( org => org.regionId == regionId )
        .Select( org => org.buildingId );
}

答案 1 :(得分:2)

就铸造而言。试试这个:

// The orgs parameter is a list of all buildings in the entire organization
// I want to retrieve only the IDs of all buildings in a particular region
private IList<int> GetRegionBuildingIDs(int regionId, List<OrgModel> orgs)
{
    var ids = (from org in orgs
              where org.regionId == regionId
              select (int)org.buildingId).ToList();
    return ids;
}

或者如果buildingId可以为空,你可以试试这个

select (int)(org.buildingId ?? 0)