• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 377
  • Last Modified:

SelectMany - Simple Linq Question

I have two lists List<Sales> and List<CashReceived>, the List<CashReceived> has zero-many records for every item in <Sales> (its internet sales, not all payments go thru, sometimes there are multiple attempts hence zero-many). I want a Select which will bring back all the Sales and all of their related CashReceived (or maybe zero ) grouped so I can analyse each group.
Is SelectMany right? I can't see how to make the join outer.
0
Silas2
Asked:
Silas2
  • 2
  • 2
2 Solutions
 
DhaestCommented:
If I understand it correctly, you want all the items from the list<sales> ?

So you need a left-join ?
http://www.developer.com/db/article.php/3739391/Implementing-a-Left-Join-with-LINQ.htm


List<sales> SalesList = ...
List<CashReceived> CashReceivedList = ...

            var LeftJoin = from s in SalesList
                           join c in CashReceivedList on s.SalesID equals c.SalesID into JoinedTables
                           from dept in JoinedTables.DefaultIfEmpty()
                        select new
                        {
                            Id = s.SalesID,
                            ....
                        };

Open in new window

0
 
Silas2Author Commented:
Right, is it possible to return a collection/list of the many side, i.e. for each item in SalesList have a nested List<CashReceived>?
0
 
Fernando SotoRetiredCommented:
Hi Silas2;

I used method syntac over query syntax because the query will be simpler.

Fernando
var query = salesList.GroupJoin(cashList, s => s.SalesID, c => c.SalesID, (Sale, Cash) => new { Sale, Cash });

foreach (var rec in query)
{
    // Sales object 
    Console.WriteLine("Sales Info = {0} ...", rec.Sale.SalesID);
    // Check to see if there are any CashReceived objects
    if (rec.Cash.Count() == 0) Console.WriteLine("\tNo Cash Received");

    foreach (var recCash in rec.Cash)
    {
        // Iterate through the CashReceived objects
        Console.WriteLine("\tCash Received = {0} ... ", recCash.Amount);
    }
}

Open in new window

0
 
Silas2Author Commented:
Thanks, that did the trick.
0
 
Fernando SotoRetiredCommented:
Hi Silas2;

You can actually close the question yourself, see help link http://www.experts-exchange.com/help.jsp#hs=29&hi=407 , Select the option "Accept multiple solutions".

Have a great day.
Fernando
0

Featured Post

Free Tool: Subnet Calculator

The subnet calculator helps you design networks by taking an IP address and network mask and returning information such as network, broadcast address, and host range.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

  • 2
  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now