简体   繁体   中英

Convert multiple rows into a single row with multiple columns using LINQ query

Let's consider following two tables:

Guest

GuestID    FirstName    Email     
----------------------------------------------
3          Sam          sam.billings@gmail.com

and

GuestAddress

AddressID    GuestID    AddressType    IsPrimaryAddress   Address1
-------------------------------------------------------------------
3            3          1              True               ABC
4            3          2              False              XYZ

I expect output something like this:

GuestID    FirstName   Email         IsPrimaryAddress  Address1  IsPrimaryAddress Address1
3          Sam         sam.billings@gmail.com  True    ABC       False             XYZ 

I found this type of solution for SQL Server, but I can not convert it to a linq query. I tried linq query but it returns two rows. Is this possible with a linq query?

You can try GroupJoin extension method and generate the result below.

var result = db.Guests.GroupJoin(db.GuestAddresses,
                            guest => guest.GuestID,
                            address => address.GuestID,
                            (g, groupedAddress) => new
                            {
                                GuestID = g.GuestID,
                                FirstName = g.FirstName,
                                Email = g.Email,
                                IsPrimaryAddress = groupedAddress.Any(x => x.AddressType == 1) ? groupedAddress.FirstOrDefault(x => x.IsPrimaryAddress).IsPrimaryAddress : false,
                                PrimaryAddress = groupedAddress.Any(x => x.AddressType == 1) ? groupedAddress.FirstOrDefault(x => x.IsPrimaryAddress).Address: string.Empty,
                                IsSecondayAddress = groupedAddress.Any(x => x.AddressType == 2) ? groupedAddress.FirstOrDefault(x => !x.IsPrimaryAddress).IsPrimaryAddress : false,
                                SecondayAddress = groupedAddress.Any(x => x.AddressType == 2) ? groupedAddress.FirstOrDefault(x => !x.IsPrimaryAddress).Address : string.Empty,
                            }).ToList();

UPDATED with multiple guest and multiple address I have checked, try this:

 namespace ConsoleApplication1
 {
  class Program
  {
    static void Main(string[] args)
    {
        Guest guest1 = new Guest { Email = "tom@gmail.com", FirstName = "tom", GuestID = 1 };
        Guest guest2 = new Guest { Email = "jerry@gmail.com", FirstName = "jerry", GuestID = 2 };
        List<Guest> listGuests = new List<Guest>();
        listGuests.Add(guest1);
        listGuests.Add(guest2);

        List<Address> AddressList = new List<Address>();
        Address address1 = new Address { AddressID = 1, AddressType = "1", GuestID = 1, IsPrimaryAddress = false, Address1 = "address1" };
        Address address2 = new Address { AddressID = 2, AddressType = "2", GuestID = 1, IsPrimaryAddress = true, Address1 = "address2" };
        Address address3 = new Address { AddressID = 1, AddressType = "1", GuestID = 2, IsPrimaryAddress = true, Address1 = "address3" };
        Address address4 = new Address { AddressID = 1, AddressType = "1", GuestID = 2, IsPrimaryAddress = false, Address1 = "address4" };

        AddressList.Add(address1);
        AddressList.Add(address2);
        AddressList.Add(address3);
        AddressList.Add(address4);

        var queryResult = from primaryAddress in ( AddressList.Where(x => x.IsPrimaryAddress == true))
                          join secAddress in (AddressList.Where(x => x.IsPrimaryAddress == false))
                          on primaryAddress.GuestID equals secAddress.GuestID
                          join guest in listGuests on  secAddress.GuestID equals guest.GuestID
                          select new GuestAddress
                            {
                                FirstName = guest.FirstName,
                                Email = guest.Email,
                                GuestID = primaryAddress.GuestID,
                                IsPrimaryAddress = primaryAddress.IsPrimaryAddress,
                                Address1 = primaryAddress.Address1,
                                SecondayAddress = secAddress.Address1,
                                IsSecondayAddress = secAddress.IsPrimaryAddress
                            };

    }
}
public class Guest
{
    public int GuestID { get; set; }
    public string FirstName { get; set; }
    public string Email { get; set; }
}
public class Address
{
    public int AddressID { get; set; }
    public int GuestID { get; set; }
    public string AddressType { get; set; }
    public bool IsPrimaryAddress { get; set; }
    public string Address1 { get; set; }
}
public class GuestAddress
{
    public string FirstName { get; set; }
    public string Email { get; set; }
    public int GuestID { get; set; }
    public bool IsPrimaryAddress { get; set; }
    public bool IsSecondayAddress { get; set; }
    public string Address1 { get; set; }
    public string SecondayAddress { get; set; }

}

}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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