2010-09-22 64 views
2

我有以下LINQ返回零如果没有任何地址(内部加入)。我如何使这个外部加入,然后只有Take(1)LINQ加入(左外)与拿(1)

var results = query.Join(
       DB.tblAddresses.Where(t => t.AddressTypeID == 'm' || t.AddressTypeID == 'b').OrderByDescending(x => x.AddressTypeID), 
       p => p.PersonID, 
       a => a.PersonID, 
       (p, a) => 
       new 
        { 
         p.PersonID, 
         p.LastName, 
         p.FirstName, 
         p.MiddleName, 
         p.SSN, 
         p.BirthDate, 
         p.DeathDate, 
         AddressLine1 = a.AddressLine1 ?? string.Empty 
       }); 

      return results.CopyLinqToDataTable(); 

回答

3

使用GroupJoin

var results = query.GroupJoin(
    addresses, 
    p => p.PersonID, 
    a => a.PersonID, 
    (p, a) => 
    new 
    { 
     p.PersonID, 
     p.LastName, 
     p.FirstName, 
     p.MiddleName, 
     p.SSN, 
     p.BirthDate, 
     p.DeathDate, 
     AddressLine1 = a.Any() 
      ? (a.First().AddressLine1 ?? string.Empty) 
      : null 
    }); 
1
query 
    .SelectMany ( 
     p => DB.tblAddresses.Where((t => t.AddressTypeID == 'm' || t.AddressTypeID == 'b') && t.PersonID == p.PersonID)**.DefaultIfEmpty()**, 
     (p, t) => 
     new 
     { 
      p.PersonID, 
         p.LastName, 
         p.FirstName, 
         p.MiddleName, 
         p.SSN, 
         p.BirthDate, 
         p.DeathDate 
      Addressline1 = (t == null ? null : t.AddressLine1) 
     } 

+0

对于每个“p”,“t”将是相同的,这不是想要的。另外,如果't'为'null',则会抛出't.Addressline1'(如果在第二行生成的集合将为空,则会发生这种情况)。 – svick 2010-09-22 20:21:54

+0

使用:Addressline1 =(t == null?null:t.AddressLine1) – Kamyar 2010-09-22 20:23:03

+0

是的,这解决了第二个问题,但第一个问题更大。 – svick 2010-09-22 20:26:38