linq sql连接多个n对n关系和筛选器

hwazgwia  于 2021-07-29  发布在  Java
关注(0)|答案(1)|浏览(365)

我有以下表格:

Customer [idCustomer, ...]
Address [idAddress, ...
Customer_Address [idCustomer, idAddress, ...]
Customer_ShippingAddress [idCustomer, idAddress, ...]

在我的web应用程序(使用razor页面的asp.net core 2.1 webapp)中,我希望按客户属性和地址属性筛选客户,例如,将名称以“test”开头、zip以“10”开头的所有客户都提供给我。
我的问题是,我不知道如何连接这些表,以便将客户保存在地址匹配的位置,这些地址匹配的位置在customer\u address或customer\u shippingaddress中。
我目前的做法是:
首先只筛选相关客户:

IQueryable<Customer> customersFiltered = _context.Customer
.Where(c => c.Name.ToLower().Contains(CurrentNameSearchString.ToLower()) && 
            c.idCusomter.ToString().StartsWith(CurrentCustomerInternalNumberSearchString));

然后我过滤所有相关地址:

IQueryable<Address> addressesFiltered = _context.Address
.Where(a => a.Street.ToLower().Contains(CurrentStreetSearchString.ToLower()) &&
            a.Country.ToLower().Contains(CurrentCountrySearchString.ToLower()) &&
            a.Zip.StartsWith(CurrentZipSearchString) &&
            a.City.ToLower().Contains(CurrentCitySearchString.ToLower()));

现在我想加入他们,这样我就可以得到一个客户名单,我可以显示在前端。我为此创建了一个dto:

public class CustomerIndexDTO{
    public string Name{ get; set; }
    public int InternalNumber { get; set; }
    public IEnumerable<string> Addresses { get; set; }
    public IEnumerable<string> ShippingAddresses { get; set; }
}

但我想不出连接方式:

List<CustomerIndexDTO> Customers = (from c in customersFiltered
                /*join here*/      
                select new CustomerDTO
                {
                    Name = c.Name,
                    InternalNumber = c.idCusomter,
                    Addresses = c.CustomerAddress.Select(x => x.IdaddresseNavigation.ToString()).Distinct().ToList()
                    ShippingAddresses = c.CustomerShippingAddress.Select(x => x.IdaddresseNavigation.ToString()).Distinct().ToList()
                }).OrderBy(c => c.Name).ToList();

我有一个工作的解决方案,我可以过滤客户和一种类型的地址,但当我想过滤两种类型的地址的查询只是运行无尽的。非常感谢你的帮助。谢谢您。

ia2d9nvy

ia2d9nvy1#

我不会使用 join 为此,由于连接更改了查询的粒度级别,因此您将为每个客户返回多个项目。还有其他方法可能更有效。这里有一个:

from c in customersFiltered
where c.CustomerAddress.Any(ca => addressedFiltered.Any(af => af.IdAddress == ca.IdAddress))
    || c.CustomerShippingAddress.Any(csa => addressedFiltered.Any(af => af.IdAddress == csa.IdAddress))
select new CustomerDTO
...

相关问题