Linq实体框架 - 让所有客户看到ID不在多个表

时间:2016-02-08 15:20:58

标签: c# entity-framework linq

我有两张桌子:

客户

汽车

和多对多表MM,它们存储:

Customer_Id Car_Id

如何让所有Car_Id不在多个表中的客户?

我试过这样:

public async Task<IEnumerable<CustomerModel>> GetNewCustomersForCar(int carId)
        {
            var sentCustomers = await _unit.Repository<Car>().Queryable()
                .SelectMany(a => a.AspNetUsers, (b, a) => new { b, a })
                .Where(b => b.Id == carId)
                .Select(ba => new CustomerModel()
                {
                    Id = ba.a.Id,
                    Email = ba.a.Email
                })
                .ToListAsync();

            var allCustomers = await _unit.Repository<AspNetUser>().Queryable()
                .Select(c => new CustomerModel()
                {
                    Id = c.Id,
                    Email = c.Email
                }).ToListAsync();

            return allCustomers.Where(ac => !sentCustomers.Contains(ac));

所以基本上我选择了所选客户的所有客户,然后我检查所有客户,最后我从所有客户中选择不包含所选客户的多个客户表的ID。

让所有尚未使用汽车的客户(所有二手车都在很多表中选择了汽车)。

1 个答案:

答案 0 :(得分:1)

如果您的Cars实体中有AspNetUser导航属性,则可以执行以下操作:

var query= await _unit.Repository<AspNetUser>()
                      .Queryable()
                      .Where(u=>!u.Cars.Any(c=>c.Id==carId))
                      .Select(c => new CustomerModel()
                                    {
                                        Id = c.Id,
                                        Email = c.Email
                                    })
                      .ToListAsync();

此外,您可以将Where更改为.Where(u=>u.Cars.All(c=>c.Id!=carId)),更具可读性