【问题标题】:LINQ SQL join multiple n-to-n relations and filterLINQ SQL 连接多个 n-to-n 关系和过滤器
【发布时间】: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


    【解决方案1】:

    我不会为此使用 join,因为 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
    ...
    

    【讨论】:

    • 谢谢。工作,是一个很好和干净的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-18
    • 2010-09-21
    • 1970-01-01
    • 1970-01-01
    • 2011-02-01
    相关资源
    最近更新 更多