Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 筛选然后重新指定导航属性_C#_Asp.net_Entity Framework_Ado.net - Fatal编程技术网

C# 筛选然后重新指定导航属性

C# 筛选然后重新指定导航属性,c#,asp.net,entity-framework,ado.net,C#,Asp.net,Entity Framework,Ado.net,我正在写一篇关于列表过滤的文章。用户选择一些选项,然后在服务器端过滤数据,并通过AJAX请求将其设置回用户 对于这个例子,假设我有一个汽车制造商表(福特、宝马、菲亚特等),它有一个外键,指向他们所有车辆的列表,这反过来又有一个外键指向车辆类型表 所以是这样的: 制造商 制造厂 名字 类型 类型ID 名字 车辆 车辆ID 制造厂 类型ID 名字 这将作为一个不错的实体和一些方便的导航属性返回。然而,这正是我面临的问题:假设我想根据制造商的车型对其进行在线过滤 foreach (var

我正在写一篇关于列表过滤的文章。用户选择一些选项,然后在服务器端过滤数据,并通过AJAX请求将其设置回用户

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

所以是这样的:

制造商

  • 制造厂
  • 名字
类型

  • 类型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,但如果可以的话,我想重新使用导航属性,而不是,在字典中编写并手动处理。

问题在于制造商.Vehicles的类型是实体集合制造商.Vehicles。Any返回类型为IEnumerable的对象,因此您要尝试以下操作:

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

这不是有效地做了同样的事情,只是用了不同的方法吗?不,因为返回的类型实现了IEntityWithRelationships not IEnumerable。嗯,当我尝试这种方法时,它仍然返回为IEnumerable。模型优先,技术上它只是ADO.NET,没有EntityFramework。因此,请尝试在查询的末尾添加.ToList:manufacturer.Vehicles=(来自manufacturer.Vehicleswhere vehicle.Type.Name==“Car”)中的vehicle。ToList并告诉我发生了什么