【问题标题】:Linq outer join with where, need help to select firstlinq外连接与where,需要帮助先选择
【发布时间】:2014-07-02 07:31:05
【问题描述】:

我有一个带有 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 只返回第一行。请帮忙

【问题讨论】:

    标签: c# mysql sql linq


    【解决方案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,
    
    };
    

    【讨论】:

      【解决方案2】:

      我认为您可以将.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 元素

      【讨论】:

      • 那么你得到了什么?
      猜你喜欢
      • 2013-03-27
      • 2011-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多