从链接模型具有0项的对象中删除项目

时间:2013-09-20 12:14:58

标签: c# asp.net asp.net-mvc linq

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

IE中。如果我有一个对象/ viewmodel:

    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";
    }
 }

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

我在尝试if (car.Features.Count()==0)

时遇到了同样的错误

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

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

谢谢,

标记

更新

我将viewModel更改为使用IEnumerable,然后执行以下操作:

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

这似乎有效 - 虽然我不是百分百肯定。如果有人能说这是否是一个“坏”修复,我会很感激。

谢谢,Mark

2 个答案:

答案 0 :(得分:1)

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

car.Features.ToList().Count

答案 1 :(得分:0)

我认为修复没有任何问题 - 当您使用来自Linq to DB(L2S,实体框架等)的IQueryable<T>时,您必须在实现它之前实现它当您在Any()内要求这些内容时,可以使用Count()foreach之类的内容。

至于为什么会这样 - 我实际上并非100%肯定,我相信错误在这方面有点误导,但我认为它抱怨的是{not> {{em> 1}} not Cars实际上已被完全评估并运行(即,当您在代码中car.Features()时,您才开始访问数据库,因为它是foreach ...)。

然而,从更广泛的角度来看,我建议您不要在Viewmodel中使用IQueryable<T>,使用IQueryable<T>会更安全 - 在渲染视图时不会意外地设置数据库访问权限,例如。

此外,当您从DataLayer或任何地方返回数据时,一个好的经验法则是尽快实现,以便能够继续实际的实际列表事情与“承诺在未来某个未指明的点上对数据库中的某些事物进行查看”相反:)所以你的DataLayers应该只返回IEnumerable<T>

如果由于某种原因你需要......

,你总是可以将IEnumerable转换为IQueryable