我有以下表格:
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();
我有一个工作的解决方案,我可以过滤客户和一种类型的地址,但当我想过滤两种类型的地址的查询只是运行无尽的。非常感谢你的帮助。谢谢您。
1条答案
按热度按时间ia2d9nvy1#
我不会使用
join
为此,由于连接更改了查询的粒度级别,因此您将为每个客户返回多个项目。还有其他方法可能更有效。这里有一个: