【问题标题】:Why I need ToList before GroupBy为什么在 GroupBy 之前需要 ToList
【发布时间】:2015-08-19 09:46:48
【问题描述】:

我正在创建我的 api 以从任何城市返回 cod_postal 以制作一些链接的下拉组合。

我意识到在 db 中有些 cod_postal 是重复的。所以我尝试使用GroupBy删除它

在我找到一个使用列表的示例之前,我遇到了一些错误。 Sample

所以我决定首先创建一个List<dto>,然后执行分组,这解决了我的重复问题,如代码所示。

问题是为什么我需要 .ToList() 来加入 DTO 和 GroupBy 步骤?

public class cod_postalDTO
{
    public int cod_postal_id { get; set; }
    public string name { get; set; }
}
public class codPostalController : ApiController
{
    private dbEntities db = new dbEntities ();

    public List<cod_postalDTO> Getcod_postal(int city_id)
    {

        List<cod_postalDTO> l_cod_postal = db.cod_postal
                                            .Where(c => c.city_id == city_id)
                                            .Select(c => new cod_postalDTO
                                            {
                                                cod_postal_id = c.cod_postal_id,
                                                name = c.name
                                            })
                                            .OrderBy(o => o.name)
                                            .ToList() // <== why i need this line?
                                            .GroupBy(c => c.name)
                                            .Select(grp => grp.First())
                                            .ToList();
        
        return l_cod_postal;
    }

如果我不包括那个中间 .ToList 得到以下错误

El método 'First' sólo se puede usar como operación de consulta final。考虑一下 la posibilidad de utilizar en su lugar el método 'FirstOrDefault' en esta instancia。

这类似于“First”方法只能用作最终操作,请考虑改用“FirstOrDefault”。

但“FirstOrDefault”在这里也不起作用

【问题讨论】:

  • 您是否尝试将Enumerable 隐式转换为列表?
  • 是什么让你觉得你需要它?你当然不需要OrderBy,因为你已经在使用GroupBy。此外,您正在寻找 Distinct 方法。
  • 不。 IEnumerable 也有 .GroupBy()。如您所见,最后一行也是一个 .ToList()

标签: c# asp.net-mvc linq


【解决方案1】:

不使用 groupby,你应该使用 distinct

【讨论】:

  • 有两个属性 cod_postal_id(唯一值)和 name(可能重复)我如何让 Distinct 带上第一对重复的?
【解决方案2】:

我收到一个错误

这不是一个很有帮助的问题描述。不过我可以猜到问题所在:ToList 将查询从 LINQ 转换为 SQL 或 EF(您还没有说您使用的是什么 ORM)到 LINQ to Objects。您的 LINQ 提供者可能不喜欢该特定模式并且无法翻译它。 LINQ to Objects 可以执行任何操作,但它在客户端上执行。

【讨论】:

  • 是的,我正在使用 EF。因此,当我执行第一个.ToList 时,我将我的数据库数据移动到 LINQ to Object 而不是 LINQ to Provider?那一个可以正确处理 grp.First() 吗? (希望我的术语正确)
  • 正确。此时表达式的类型是 IEnumerable,这会导致 Queryable.* 方法不再适用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-19
  • 1970-01-01
相关资源
最近更新 更多