LINQ Join查询(表之间有可为空的ref)

Ser*_*lyi 2 c# linq entity-framework nullable

我有3张桌子.

例如客户,公司地址.

  • 客户已获得公司的支持.

  • 公司有2个可归属的地址(账单和发货),因此在某些情况下可能不存在地址.

我需要make join查询,但是在等于Company.BillingAddressCompany.ShippingAddress等于的情况下null,我没有得到所有数据).

我试过了(但这是错误的查询):

var res = (from client in context.Clients
    join clientCompany in context.Companies 
    on client.ClientCompanyId equals clientCompany.Id

    into clientCompanyJoin

    from company in clientCompanyJoin
    join addressBilling in context.Addresses
    on company.BillingAddressId equals addressBilling.Id

    join addressShipping in context.Addresses
    on company.ShippingAddressId equals addressShipping.Id

    select new
    {
        Client = client,
        Company = company,
        BillingAddress = ???????
        ShippingAddress = ???????
    }
);
Run Code Online (Sandbox Code Playgroud)

你能帮我做一个连接查询或解释怎么做吗?

谢谢.

Fur*_*dar 5

试试这段代码片段:

var res = (from client in context.Clients
            join clientCompany in context.Companies 
            on client.ClientCompanyId equals clientCompany.Id
            into clientCompanyJoin
            from company in clientCompanyJoin
            join addressBilling in context.Addresses
            on company.BillingAddressId equals addressBilling.Id
            where !String.IsNullOrEmpty(addressBilling.Address)
            join addressShipping in context.Addresses
            on company.ShippingAddressId equals addressShipping.Id
            where !String.IsNullOrEmpty(addressShipping.Address)
            select new
            {
                Client = client,
                Company = company,
                BillingAddress = addressBilling.Address,
                ShippingAddress = addressShipping.Address
            });
Run Code Online (Sandbox Code Playgroud)

补充:根据您的意见,这是您需要的代码段.现在你可以有你的客户公司的数据,即使ShippingAddressIdBillingAddressId等于null像什么Left Join在做SQL.

var res = (from client in context.Clients
            join company in context.Companies 
            on client.ClientCompanyId equals company.Id
            join addressBilling in context.Addresses
            on company.BillingAddressId equals addressBilling.Id 
            into addrBillingGroup
            from gAddrBilling in addrBillingGroup.DefaultIfEmpty() // left join
            join addressShipping in context.Addresses
            on company.ShippingAddressId equals addressShipping.Id 
            into addrShippingGroup
            from gAddrShipping in addrShippingGroup.DefaultIfEmpty() // left join
            select new
            {
                Client = client,
                Company = company,
                BillingAddress = 
                    gAddrBilling == null ? null : gAddrBilling.Address,
                ShippingAddress = 
                    gAddrShipping == null ? null : gAddrShipping.Address
            });
Run Code Online (Sandbox Code Playgroud)