Let Vs Into Keywords in LINQ

This article shows two keywords of LINQ. These keywords are very helpful when working with a set of object collections using LINQ.

First I will go through the Into keyword and its use.

I used the following collection in this article, on which I've done actions in this article.

  1. List<Mobile> objMobileCollection = new List<Mobile>  
  2. {   
  3. new Mobile{Provider="Apple",ModelName="IPhone3",ModelNumber="I100",MemoryCard=4},  
  4. new Mobile{Provider="Apple",ModelName="IPhone4",ModelNumber="I101",MemoryCard=8},  
  5. new Mobile{Provider="Apple",ModelName="IPhone4S",ModelNumber="I102",MemoryCard=16},  
  6. new Mobile{Provider="Apple",ModelName="IPhone5",ModelNumber="I103",MemoryCard=32},  
  7. new Mobile{Provider="Samsung",ModelName="GalaxyS",ModelNumber="S001",MemoryCard=4},  
  8. new Mobile{Provider="Samsung",ModelName="GalaxyS2",ModelNumber="S002",MemoryCard=16},  
  9. new Mobile{Provider="Samsung",ModelName="GalaxyS3",ModelNumber="S003",MemoryCard=20},  
  10. new Mobile{Provider="Samsung",ModelName="Grand",ModelNumber="G001",MemoryCard=4},  
  11. new Mobile{Provider="Nokia",ModelName="LUMIA530",ModelNumber="N1",MemoryCard=8},  
  12. new Mobile{Provider="Nokia",ModelName="LUMIA730",ModelNumber="N2",MemoryCard=16},  
  13. new Mobile{Provider="Nokia",ModelName="LUMIA930",ModelNumber="N3",MemoryCard=20},  
  14. };  
Into keyword

The Into keyword allows creating a temporary variable to store the results of a group, join or select clause into a new variable.
  1. var resultSet = from mobile in objMobileCollection  
  2. group mobile by new { mobile.Provider } into mGroup  
  3. orderby mGroup.Key.Provider  
  4. select new  
  5. {  
  6. Provider = mGroup.Key.Provider,  
  7. ModelName = mGroup.OrderBy(x => x.ModelName),  
  8. //ModelNumber = mGroup.OrderBy(x => x.ModelNumber),  
  9. //MemoryCard = mGroup.OrderBy(x => x.MemoryCard),  
  10. };  
In the above query after applying Into on mobile groping it creates the type mGroup variable to apply the next filter or create a temporary variable “mGroup” for further operations.

Annonymous Type selection

As in the code below:
  1. foreach (var items in resultSet)  
  2. {  
  3. Console.WriteLine("{0} - {1}", items.Provider, items.ModelName.Count());  
  4. Console.WriteLine("------------------------------------------------");  
  5. foreach (var item in items.ModelName)  
  6. {  
  7. Console.WriteLine(item.Provider + "\t" + item.ModelName + "\t\t" + item.ModelNumber.Trim() + "\t" + item.MemoryCard);  
  8. }  
  9. Console.WriteLine();  
  10. }  
  11. Console.ReadLine();  
Please have a look at the output as shown in the following image:

group by provider in Link

Let Keyword

The Let keyword permits you to store the result of the query that can be used further in subsequent queries.

It creates a new variable and initializes it with the result of the expression and can be used further in queries just the opposite of the Into keyword, which means you created a new variable and you also can use the previous variable so you can use both in the further operations.
  1. var resultSetLet = (from mobile in objMobileCollection  
  2. group mobile by new { mobile.Provider } into mGroup  
  3. //orderby mGroup.Key.Provider,mGroup.Key.MemoryCard  
  4. let avgMemory = mGroup.Sum(x => x.MemoryCard) / mGroup.Count()  
  5. where avgMemory > 11  
  6. select new  
  7. {  
  8. Provider = mGroup.GroupBy(x => x.Provider),  
  9. ModelName = mGroup.OrderBy(m => m.ModelName),  
  10. ModelNumber = mGroup.OrderBy(x => x.ModelNumber)  
  11. //MemoryCard = mGroup.OrderBy(x => x.MemoryCard),  
  12. }).ToList();  
Kindly refer to the image shown below for further reference:

Group by is declared with provider value in Link

Please have a look at the complete code shown below:
  1. var resultSetLet = (from mobile in objMobileCollection  
  2. group mobile by new { mobile.Provider } into mGroup  
  3. //orderby mGroup.Key.Provider,mGroup.Key.MemoryCard  
  4. let avgMemory = mGroup.Sum(x => x.MemoryCard) / mGroup.Count()  
  5. where avgMemory > 11  
  6. select new  
  7. {  
  8. Provider = mGroup.GroupBy(x => x.Provider),  
  9. ModelName = mGroup.OrderBy(m => m.ModelName),  
  10. ModelNumber = mGroup.OrderBy(x => x.ModelNumber)  
  11. //MemoryCard = mGroup.OrderBy(x => x.MemoryCard),  
  12. }).ToList();  
  13.   
  14. foreach (var items in resultSetLet)  
  15. {  
  16. Console.WriteLine("{0} - {1}", items.Provider, items.ModelNumber.Count());  
  17. Console.WriteLine("------------------------------------------------");  
  18. foreach (var item in items.ModelNumber)  
  19. {  
  20. Console.WriteLine(item.Provider + "\t" + item.ModelName + "\t\t" + item.ModelNumber + "\t" + item.MemoryCard);  
  21. }  
  22. Console.WriteLine();  
  23. }  
  24. Console.ReadLine();  
Please have a look at the output as shown below in the image:

Let Keyword in link

Note: Group by multiple columns in LINQ to SQL as shown in the image below:

multiple keys on group by clasue

I wish it will help you utilize both features at the best.
To learn more about MVC please go to the following link.

MVC Articles

Thanks.
Enjoy coding and reading.