【问题标题】:IQueryable vs ICollection (List)IQueryable 与 ICollection(列表)
【发布时间】:2018-09-06 08:37:13
【问题描述】:

我有这样一个案例研究:

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&lt;CategoryType&gt;IQueryable&lt;CategoryType&gt; 并从查询末尾删除 ToList() 然后我没有任何结果:

问题:

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

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

我有:

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

并在ToList()结尾处:

this.CategoryTypePagination = categories.AsQueryable();

IQueryable 的情况下刚刚删除.AsQueryable()

【问题讨论】:

  • 发布实际代码,而不是截图和描述。代码和屏幕截图不匹配。缺少对象定义。您声称您能够将 IQueryable 分配给 List 变量而不会出现编译错误?
  • 我认为this link 比我的解释尝试更有帮助
  • Panagiotis Kanavos - 我编辑了帖子。

标签: c# linq icollection


【解决方案1】:

【讨论】:

  • 代码直接设置ValueTypes 属性——即使在第二个“sn-ps”中该值应该是一个不能分配给 List
【解决方案2】:

根据thisIQueryable 使用了一个叫做lazy loading的东西。

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

【讨论】:

  • 代码甚至没有运行的可能性更大。它试图将 IQueryable 分配给 List 变量。这应该抛出
  • @PanagiotisKanavos 不,OP 表示他将类型更改为IQueryable 并删除了ToList() 方法。在【图片中也可以看出,代码运行良好。
  • 截图与代码不符。它们完全来自一个不同的 sn-p。 OP 没有解释进行了哪些更改 - IQueryable 没有 .Count 属性。如果ValueTypes 仍然是一个列表,那么IQueryable 是如何分配给它的?由于ValueTypes 包含查询的 root 结果,因此它的计数不会受到延迟加载的影响
猜你喜欢
  • 2017-03-12
  • 1970-01-01
  • 2013-09-03
  • 2011-05-26
  • 1970-01-01
  • 2010-12-05
  • 1970-01-01
  • 1970-01-01
  • 2013-05-27
相关资源
最近更新 更多