LINQ to Entities - 跨关系查询和过滤

时间:2016-02-24 15:48:14

标签: linq linq-to-entities

我在查询一组使用LINQ和Lambda表达式的相关实体时非常困难。

我有四个相关的实体......

车辆 1:n VehicleTypes n:1 价格 1:n CustomerTypes

我正在尝试获取给定Vehicle和CustomerType的价格列表。例如,我想获得福特野马(VehicleTypeId = 2)的所有价格。在那些价格中,我想包括价格所属的CustomerType(政府,商业,零售)。

我以为我可能会做以下事情......

Prices.Include(p => p.VehicleTypes)
      .Include(p => p.CustomerTypes)
      .Where(p => p.VehicleTypes.Vehicles.Select(v => v.Id == 2)

但是我收到了这个错误......

Cannot implicitly convert type 'System.Collections.Generic.IEnumerable<bool>' to 'bool'

我似乎无法创建Where条件,我可以过滤要购买的车辆的ID,但也在结果中包含CustomerType。

编辑:只是想注意我已添加using System.Data.Entity,因此我可以访问类型安全包含扩展程序

1 个答案:

答案 0 :(得分:2)

如果您需要此类车辆的价格和特定客户类型,您可以按以下步骤进行过滤:

var prices= Prices.Include(p => p.VehicleTypes)
                  .Include(p => p.CustomerTypes)
                  .Where(p => p.VehicleTypes.Vehicles.Any(v => v.Id == 2)// With this condition you make sure that Mustang belong to this set of vehicles
                           && p.CustomerTypes.Type=="Commercial");

但是如果你想过滤结果中的车辆,你需要将你的查询投射到匿名类型或DTO:

var query=  Prices.Include(p => p.VehicleTypes)
                  .Include(p => p.CustomerTypes)
                  .Where(p => p.VehicleTypes.Vehicles.Any(v => v.Id == 2)
                           && p.CustomerTypes.Type=="Commercial")
                  .Select(p=>new {CustomerType=p.CustomerTypes.Type, 
                                  Vehicles=p.VehicleTypes.Vehicles.Where(v => v.Id == 2)});