简体   繁体   English

Linq在哪里与外部联接,需要帮助才能首先选择

[英]Linq outer join with where, need help to select first

I have a outer join with a where clause. 我有一个where子句的外部联接。 It returns multiple responses and I need to select the first one. 它返回多个响应,我需要选择第一个。

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

};

So I need the x3 to only return the first row. 所以我需要x3只返回第一行。 Please help 请帮忙

This worked for me. 这对我有用。

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,

};

I think you can just change the .DefaultIfEmpty() to .FirstOrDefault() 我认为您可以将.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()

This should only return you the first x3 element 这只会返回您的第一个x3元素

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM