0

如何检查嵌套模型对象是否有任何项目。

IE。如果我有一个对象/视图模型:

    public class CarViewModel
    {
    public string Type { get; set; }
    public long ID { get; set; }
    public virtual IQueryable<Feature> Features { get; set; }
    }

    public class Feature
    {
    public string Offer { get; set; }
    public decimal Rate { get; set; }
    public virtual CarViewModel CarViewModel { get; set; }
    }

...并按如下方式填充 - 因此 1 个汽车对象具有 2 个附加功能,而另一个汽车对象没有附加功能:

[
{"Type":"SoftTop","ID":1,
"Features":
    [{"Offer":"Alloys","Rate":"500"},{"Offer":"Standard","Rate":"100"}]},
{"Type":"Estate","ID":2,
"Features":[]}
]

所以在我的代码中,我用上面的数据填充了“汽车”:

foreach (var car in Cars)
{
    if (!car.Features.Any())
    {
        car.Type = "Remove";
    }
 }

但是,我收到消息:This method is not supported against a materialized query result.在 if (!car.Features.Any()) 行。

我在尝试时遇到了同样的错误if (car.Features.Count()==0)

有没有办法检查功能的数量是否为 0?

或者是否有一种从对象中删除任何项目的 linq 方法,其中特征数为 0?

谢谢,

标记

更新

我将 viewModel 更改为使用 IEnumerable,然后使用以下内容:

cars=cars.Where(x => x.Feature.Count()>0).ToList();

这似乎有效 - 尽管我不是 100% 确定。如果有人能说这是否是“坏”修复,我将不胜感激。

谢谢,马克

4

2 回答 2

1

尝试先获取结果然后检查计数

car.Features.ToList().Count
于 2013-09-20T12:42:56.497 回答
0

我认为修复没有任何问题 - 当您使用IQueryable<T>来自 Linq 到 DB(L2S、实体框架等)的修复时,您几乎必须先实现它,然后才能使用类似的东西Any()Count()当您询问时对于里面的这些东西foreach

至于为什么会这样——我实际上不是 100% 确定,我认为这个错误在这方面有点误导,但我认为它抱怨的是,两者都Cars没有car.Features()真正得到充分评估和运行(即你只是在您进入代码时才开始访问数据库,foreach ...因为它是IQueryable<T>)。

但是,从更广泛的角度来看,我建议您不要IQueryable<T>在 Viewmodels 中使用,这样使用起来更安全IEnumerable<T>- 例如,在渲染视图时不会意外触发数据库访问。

而且,当您从 DataLayer 或任何地方返回数据时,一个好的经验法则是尽快实现它以便能够继续使用实际事物的实际列表,而不是“承诺去和在未来某个未指定的时间点查找“数据库中的某些内容:) 所以你的 DataLayers 应该只返回IEnumerable<T>'s

如果出于某种原因需要...,您始终可以将 IEnumerable 转换为 IQueryable。

于 2013-09-20T14:41:07.153 回答