【问题标题】:Filtering and then reassigning navigation properties过滤然后重新分配导航属性
【发布时间】:2012-08-17 16:36:34
【问题描述】:

我正在写一个处理列表过滤的网站。用户选择一些选项,数据在服务器端过滤并通过 AJAX 请求返回给用户。

对于这个例子,假设我有一个汽车制造商表(福特、宝马、菲亚特等),它有一个外键指向他们所有车辆的列表,而外键又指向一个车辆表类型。

所以应该是这样的:

制造商

  • 制造商 ID
  • 姓名

类型

  • 类型ID
  • 姓名

车辆

  • 车辆 ID
  • 制造商 ID
  • 类型ID
  • 姓名

这将作为一个不错的实体和一些方便的导航属性返回。但是,这是我面临的问题:假设我想根据类型过滤制造商的车辆,内联。

foreach (var manufacturer in manufacturers)
{
    manufacturer.Vehicles = manufacturer.Vehicles.Any(v => v.Type.Name == "Car"));
}

这看起来很简单,但我得到了错误:

无法将类型“System.Collections.Generic.IEnumerable”隐式转换为“System.Data.Objects.DataClasses.EntityCollection”。存在显式转换(您是否缺少演员表?)

强制转换为 EntityCollection 没有帮助,并在运行时引发异常。甚至可以将 Linq 查询的结果分配给导航属性吗?还有另一种方法吗?我正在使用 ViewModel,但如果可以的话,我想重新使用导航属性,而不是写字典并手动处理。

【问题讨论】:

    标签: c# asp.net entity-framework ado.net


    【解决方案1】:

    问题在于 ma​​nufacturer.Vehicles 的类型是 EntityCollection 并且 ma​​nufacturer.Vehicles.Any 返回一个 类型的对象>IEnumerable,所以你想尝试如下:

    foreach ( manufacturer in manufacturers) {
       manufacturer.Vehicles = (from vehicle in manufacturer.Vehicleswhere vehicle.Type.Name == "Car");
    }
    

    【讨论】:

    • 这不是有效地做同样的事情,只是方式不同吗?
    • 否,因为返回的类型实现了 IEntityWithRelationships 而不是 IEnumerable。
    • 嗯,当我尝试这种方式时,它仍然以 IEnumerable 的形式返回。
    • 模型优先,技术上它只是 ADO.NET,没有 EntityFramework。
    • 然后尝试在查询末尾添加 .ToList:manufacturer.Vehicles = (from vehicle in manufacturer.Vehicleswhere vehicle.Type.Name == "Car").ToList 并告诉我发生了什么
    猜你喜欢
    • 2013-01-14
    • 1970-01-01
    • 2010-12-22
    • 2018-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多