2017-09-10 18 views
0

多列讓我們考慮以下兩個表:轉換多行成單排使用LINQ查詢

遊客

GuestID FirstName Email  
---------------------------------------------- 
3   Sam   [email protected] 

GuestAddress

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

我期望的輸出是這樣的:

GuestID FirstName Email   IsPrimaryAddress Address1 IsPrimaryAddress Address1 
3   Sam   [email protected] True ABC  False    XYZ 

我發現這種類型的SQL Server的解決方案,但我不能將其轉換爲LINQ查詢。我試過linq查詢,但它返回兩行。這可能與linq查詢?

+0

你不能在同一個對象 – adiga

+0

I 2'IsPrimaryAddress'性質不管IsPrimaryAddress屬性名稱是否更改,都希望單行結果。我的意思是,如果我們需要重新命名爲IsPrimaryAddress1和IsPrimaryAddress2作爲輸出,則沒有問題。 @adiga – FaHaD

+0

通常,這種類型的結果在EF中表示爲具有'GuestAddress'對象集合的'Guest'對象。無論如何,哪個應該是你的實體模型。 –

回答

1

您可以嘗試GroupJoin擴展方法並生成以下結果。

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(); 
+0

它不工作! @SMA – FaHaD

+0

嗨法赫德..你有什麼錯誤? – SMA

+0

訪客和guestAddress在查詢的最開始處有一個錯誤,我想它可能是db.Guests和db.GuestAddresses,不是嗎? @SMA – FaHaD

0

多客人,我檢查了多個地址更新時,試試這個:

namespace ConsoleApplication1 
{ 
    class Program 
    { 
    static void Main(string[] args) 
    { 
     Guest guest1 = new Guest { Email = "[email protected]", FirstName = "tom", GuestID = 1 }; 
     Guest guest2 = new Guest { Email = "[email protected]", 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; } 

} 

}