我有一个带有where子句的外连接。它返回多个响应,我需要选择第一个。
from p in context.Persons
join c in context.Companies on p.PersonId equals c.CompanyId
join a1 in context.Addresses on p.AddressDeliveryId equals a1.AddressId into da from x1 in da.DefaultIfEmpty()
join a2 in context.Addresses on p.AddressInvoiceId equals a2.AddressId into ia from x2 in ia.DefaultIfEmpty()
//This line returns multiple answers
join a3 in context.Addresses on p.PersonId equals a3.PersonId into pa from x3 in pa.Where(a3 => a3.AddressLocationId == 5).DefaultIfEmpty()
orderby p.PersonId descending
where p.IsProvider.Equals(false)
&& p.Obsolete.Equals(false)
&& p.Locked.Equals(false)
&& p.IsCustomer.Equals(true)
&& p.PersonType.Equals(1)
select new
{
p, c, x1, x2, x3
};
所以我需要x3才能返回第一行。请帮忙
答案 0 :(得分:1)
这对我有用。
from p in context.Persons
join c in context.Companies on p.PersonId equals c.CompanyId
join a1 in context.Addresses on p.AddressDeliveryId equals a1.AddressId into da
from x1 in da.DefaultIfEmpty()
join a2 in context.Addresses on p.AddressInvoiceId equals a2.AddressId into ia
from x2 in ia.DefaultIfEmpty()
let a3 = context.Addresses.FirstOrDefault(a3 => a3.AddressLocationId == 5 && a3.PersonId == p.PersonId && a3.Obsolete == false)
//This line worked for me
orderby p.PersonId descending
where p.IsProvider.Equals(false)
&& p.Obsolete.Equals(false)
&& p.Locked.Equals(false)
&& p.IsCustomer.Equals(true)
&& p.PersonType.Equals(1)
select new
{
p,
c,
DeliveryAddress = x1.Address1,
DeliveryAddressCity = x1.PoCity,
DeliveryAddressZipCode = x1.PoPostalCode,
InvoiceAddress = x2.Address1,
InvoiceAddressCity = x2.PoCity,
InvoiceAddressZipCode = x2.PoPostalCode,
PhoneNumber = a3.Address1,
PhoneNumberAddressId = (a3 != null) ? a3.AddressId : -1,
};
答案 1 :(得分:0)
我认为您可以将.DefaultIfEmpty()
更改为.FirstOrDefault()
join a3 in context.Addresses on p.PersonId equals a3.PersonId into pa from x3 in pa.Where(a3 => a3.AddressLocationId == 5).FirstOrDefault()
这应该只返回第一个x3元素