using System; using System.Collections; using System.Collections.Generic; using System.Linq; public class Test { public static void Main() { var destinctList = new List() { new DestinctItem() { ClientName = "Alpha", ClientID = 1, ClientProductName="AAA" }, new DestinctItem() { ClientName = "Bravo", ClientID = 2, ClientProductName="BBB" } }; var someContext_ClientAlias = new List() { new ClientAlias() { Name = "Alpha", ClientID = 1, CreationDate = DateTime.Now.AddDays(-7) } }; var someContext_ClientProductAlias = new List() { new ClientProductAlias() { Name = "AAA", ClientID = 1, ClientProductID = 101, CreationDate = DateTime.Now.AddDays(-7) } }; var data = (from list in destinctList join ca in someContext_ClientAlias on list.ClientName equals ca.Name into list_client_join from list_client in list_client_join.DefaultIfEmpty() join cpa in someContext_ClientProductAlias on new { ClientID = (long)list.ClientID, Name = list.ClientProductName } equals new { cpa.ClientID, cpa.Name } into j1 // maybe needs the following: where j1.Any () from j2 in j1.DefaultIfEmpty() orderby list_client.CreationDate descending orderby j2.CreationDate descending select new { ClientID = list_client.ClientID, ClientName = list.ClientName, ClientProductID = j2.ClientProductID, ClientProductName = list.ClientProductName } ).ToList(); Console.WriteLine("First query:"); foreach(var result in data) Console.WriteLine(result); // alternate query var data2 = (from list in destinctList let ca = someContext_ClientAlias .OrderByDescending (cca => cca.CreationDate) .FirstOrDefault (cca => cca.Name == list.ClientName) let cca = someContext_ClientProductAlias .OrderByDescending (ccpa => ccpa.CreationDate) .FirstOrDefault (ccpa => int.Equals(ccpa.ClientID, ca == null ? -1 : ca.ClientID) && string.Equals(ccpa.Name,list.ClientProductName)) select new { ClientID = ca != null ? ca.ClientID : -1, ClientName = list.ClientName, ClientProductID = cca != null ? cca.ClientProductID : -1, ClientProductName = list.ClientProductName } ).ToList(); Console.WriteLine("Second query:"); foreach(var result in data2) Console.WriteLine(result); } } public class DestinctItem { public long ClientID { get; set; } // matches CPA.ClientID public string ClientName { get; set; } // matches ClieantAlias.Name public string ClientProductName { get; set; } // matches CPA.Name } public class ClientAlias { public long ClientID { get; set; } public string Name { get; set; } // matches DistinctItem.Name public DateTime CreationDate {get; set;} } public class ClientProductAlias { public long ClientID { get; set; } // matches DestinctItem.ClientID public long ClientProductID { get; set; } public string Name { get; set; } // matches Destinct.ClientProductName public DateTime CreationDate {get; set;} }