【发布时间】:2020-06-10 19:18:57
【问题描述】:
我有以下表格:
Customer [idCustomer, ...]
Address [idAddress, ...
Customer_Address [idCustomer, idAddress, ...]
Customer_ShippingAddress [idCustomer, idAddress, ...]
在我的 Web 应用程序(asp.net core 2.1 WebApp using razor pages)中,我想按客户属性和地址属性过滤客户,例如给我所有名称以“test”开头且 zip 以“10”开头的客户。
我的问题是我不知道如何加入表格,以便将客户保留在 Customer_Address 或 Customer_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();
我有一个可行的解决方案,我可以在其中过滤客户和一种地址类型,但是当我想过滤这两种类型的地址时,查询只会无休止地运行。帮助高度赞赏。谢谢你。
【问题讨论】:
标签: sql sql-server linq asp.net-core join