从链接模型具有 0 个项目的对象中删除项目
本文关键字:项目 对象 删除项目 链接 模型 | 更新日期: 2023-09-27 18:32:04
如何检查嵌套的模型对象是否有任何项目。
即,如果我有一个对象/视图模型:
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 个 Car 对象具有 2 个附加功能,而另一个 Car 对象没有其他功能:
[
{"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?
谢谢
马克
更新
我将视图模型更改为使用 IEnumerable,然后执行以下操作:
cars=cars.Where(x => x.Feature.Count()>0).ToList();
这似乎有效 - 尽管我不是 100% 确定。 如果有人能说这是否是一个"糟糕"的修复,我将不胜感激。
谢谢,马克
尝试先获取结果,然后检查计数
car.Features.ToList().Count
修复没有任何问题 - 当您使用来自 Linq 到 DB(L2S、实体框架等)的IQueryable<T>
时,您几乎必须实现它,然后才能使用 Any()
或 Count()
之类的东西当你在foreach
中要求这些东西时。
至于为什么会这样 - 我实际上不是 100% 确定,我相信错误在这方面有点误导,但我认为它所抱怨的是Cars
也不是car.Features()
实际上都没有经过全面评估和运行(即你只是在你进入代码foreach ...
时才开始访问数据库,因为它是IQueryable<T>
)。
更广泛的角度来看,我建议您不要在视图模型中使用IQueryable<T>
,使用IEnumerable<T>
更安全 - 例如,在渲染视图时不会意外触发数据库访问。
此外,当您从 DataLayer 或任何地方返回数据时,一个好的经验法则是尽快实现它,以便能够继续实际事物的实际列表,而不是"承诺去寻找"数据库中的某些事物在未来某个不特定的时间点:) 因此,您的数据层应该只返回IEnumerable<T>'s
如果出于某种原因您需要