IQueryable 与 ICollection(列表)

IQueryable vs ICollection (List)

我有这样一个案例研究:

ToList() 案例:

    List<CategoryType> categories = (from c in categoryTypes where c.IsSysParam == isSysParamCategory select new CategoryType { Code = c.Code, CreateDate = c.CreateDate, EditDate = c.EditDate, IsProductCategory = c.IsProductCategory, IsSysParam = c.IsSysParam, Name = c.Name, TypeId = c.TypeId, ValueTypes = new List<ValueType>() }).ToList();

    List<ValueType> valueTypeList = new List<ValueType>();
    foreach (var c in categories.ToList())
    {
        valueTypeList = categoryTypes.Where(x => x.TypeId == c.TypeId).SelectMany(v => v.ValueTypes).Where(v => v.ParentValueId == null).ToList();
        c.ValueTypes = valueTypeList;
    }

IQueryable 案例:

当我将第一个查询 - List<CategoryType> 更改为 IQueryable<CategoryType> 并从查询末尾删除 ToList() 时,我没有任何结果:

问题:

我要求解释,我不明白为什么会这样。我知道 IQueryable 在数据库方面做了一些工作.

编辑: 代码运行,最终效果图。

我有:

  public IQueryable<CategoryType> CategoryTypePagination { get; set; }

并且在 ToList() 案例的结尾:

this.CategoryTypePagination = categories.AsQueryable();

IQueryable 案例中刚刚删除 .AsQueryable()

你得看看"Deferred Query Execution" and "Immediate Query Execution"

根据 this, IQueryable uses something called lazy loading

因此 IQueryable 的结果在首次使用之前不会加载,例如在 SumToListToArray 方法中,而 ToList 需要加载数据。因此,您可以在初始化两个对象后看到差异。