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

我有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 = ??????? } ); 

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

谢谢。

试试这段代码片段:

 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 }); 

补充:根据您的意见,这是您需要的代码段。 即使ShippingAddressIdBillingAddressId等于null也可以获得客户端公司数据,就像在SQL Left Join一样。

 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 }); 

我想你想做一个外连接。 以下是如何在客户和订单的“Northwind”数据库上执行此操作的示例:

 var ctx = new NorthwindDataContext(); var customers = from c in ctx.Customers join o in ctx.Orders on c.CustomerID equals o.CustomerID into inJoin from outJoin in inJoin.DefaultIfEmpty() orderby c.CustomerID, outJoin.OrderID select new { c.CustomerID, c.CompanyName, OrderID = (int?)outJoin.OrderID, OrderDate = (DateTime?)outJoin.OrderDate };