我有两张桌子:
客户
汽车
和多对多表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。
让所有尚未使用汽车的客户(所有二手车都在很多表中选择了汽车)。
答案 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))
,更具可读性