We have a class structure as listed below
public class ItemDTO
{
public int ItemID { get; set; }
}
public class CostPageDTO
{
public string CostPageNumber { get; set; }
public List<ItemDTO> Items { get; set; }
}
There are two lists – 1) List of Costpage and Items present in the database 2) User selected costpages
QUESTION
We need to compare these two lists and get a resultant list that has costpages for which the count of distinct items in the actual set and selected set are same.
What is the best performing LINQ for this (in Chain-Method approach)?
EXPECTED RESULT
Expected Result based on the following scenario is a list with only 1 costpage – “C2” (for which items match)

CODE
static void Main(string[] args)
{
List<CostPageDTO> selectedCostPageAndItems = GetSelectedCostPageAndItems();
List<CostPageDTO> actualItems = GetActualItems();
//LINQ code to get the matching count costPages
}
private static List<CostPageDTO> GetSelectedCostPageAndItems()
{
ItemDTO i1 = new ItemDTO();
i1.ItemID = 1;
ItemDTO i2 = new ItemDTO();
i2.ItemID = 2;
ItemDTO i3 = new ItemDTO();
i3.ItemID = 3;
CostPageDTO c1 = new CostPageDTO();
c1.CostPageNumber = "C1";
c1.Items = new List<ItemDTO>();
c1.Items.Add(i1);
CostPageDTO c2 = new CostPageDTO();
c2.CostPageNumber = "C2";
c2.Items = new List<ItemDTO>();
c2.Items.Add(i2);
c2.Items.Add(i3);
//CostPageDTO c2Duplicate = new CostPageDTO();
//c2Duplicate.CostPageNumber = "C2";
//c2Duplicate.Items = new List<ItemDTO>();
//c2Duplicate.Items.Add(i2);
//c2Duplicate.Items.Add(i3);
List<CostPageDTO> selectedCostPageAndItems = new List<CostPageDTO>();
selectedCostPageAndItems.Add(c1);
selectedCostPageAndItems.Add(c2);
//selectedCostPageAndItems.Add(c2Duplicate);
return selectedCostPageAndItems;
}
private static List<CostPageDTO> GetActualItems()
{
ItemDTO i1 = new ItemDTO();
i1.ItemID = 1;
ItemDTO i2 = new ItemDTO();
i2.ItemID = 2;
ItemDTO i3 = new ItemDTO();
i3.ItemID = 3;
ItemDTO i3Duplicate = new ItemDTO();
i3Duplicate.ItemID = 3;
CostPageDTO c1 = new CostPageDTO();
c1.CostPageNumber = "C1";
c1.Items = new List<ItemDTO>();
c1.Items.Add(i1);
c1.Items.Add(i2);
c1.Items.Add(i3);
CostPageDTO c2 = new CostPageDTO();
c2.CostPageNumber = "C2";
c2.Items = new List<ItemDTO>();
c2.Items.Add(i2);
c2.Items.Add(i3);
c2.Items.Add(i3Duplicate);
List<CostPageDTO> actualItems = new List<CostPageDTO>();
actualItems.Add(c1);
actualItems.Add(c2);
return actualItems;
}