我有3张桌子。
例如客户,公司和地址。
客户已获得公司的支持。
公司已经有2个可归属地址(账单和发货),因此在某些情况下可能不存在地址。
我需要进行联接查询,但如果Company.BillingAddress
或Company.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 = ???????
}
);
你能帮我做一个联接查询或解释怎么做吗?
感谢。
答案 0 :(得分: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
});
ADDED:根据您的评论,以下是您需要的代码段。您现在可以拥有客户和公司数据,即使ShippingAddressId
或BillingAddressId
等于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
});
答案 1 :(得分:2)
我想你想做一个外连接。以下是如何在客户和订单的“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
};