> >int InvoiceAmount = 1000000; > >var results = > from cl in Context.clients.ToList().Distinct() > from inv in cl.invoices.ToList().Where(x => x.invoiceamount >= InvoiceAmount) > where cl.id == inv.clientid > select cl; >>
>int i = 0; > foreach (client c in results) > { > i++; > Console.WriteLine("Company: {0} (id: {1})", c.companyname, c.id); > > foreach (invoice inv in c.invoices) // This is where I think the query selects all invoices related to the current client. > { > Console.WriteLine("\t Invoice reference: {0}", inv.invoicereference); > Console.WriteLine("\t\t Invoice date: {0}", inv.invoicedate.Value.ToString("dd/MM/yyyy")); > Console.WriteLine("\t\t Invoice amount: {0}", inv.invoiceamount.Value.ToString("C")); > Console.WriteLine("\t\t Charge type: {0}", inv.chargetypes.chargetypename); > } >>
int InvoiceAmount = 1000000; var results = from cl in Context.clients.ToList().Distinct() where cl.invoices.Any(inv => inv.invoiceamount >= InvoiceAmount) select cl;Third, your query only selects the client. The client's invoices navigation property will always include all of the invoices for the client as it doesn't know anything about your previous query. You need to filter it when using it:
int i = 0; foreach (client c in results) { i++; Console.WriteLine("Company: {0} (id: {1})", c.companyname, c.id); foreach (invoice inv in c.invoices.Where(x => x.invoiceamount >= InvoiceAmount).ToList()) { Console.WriteLine("\t Invoice reference: {0}", inv.invoicereference); Console.WriteLine("\t\t Invoice date: {0}", inv.invoicedate.Value.ToString("dd/MM/yyyy")); Console.WriteLine("\t\t Invoice amount: {0}", inv.invoiceamount.Value.ToString("C")); Console.WriteLine("\t\t Charge type: {0}", inv.chargetypes.chargetypename); }I would change the whole thing to the following:
int InvoiceAmount = 1000000; var results = Context.invoices // Start at invoices because this is the list we really care about .Include(inv => inv.client) // Eager load the client so it doesn't require additional queries .Where(inv => inv.invoiceamount >= InvoiceAmount) // Filter results .GroupBy(inv => inv.client) // Group results by client so we can loop through the clients .ToList(); // Execute the query foreach (var invGroup in results) { // invGroup is an IGrouping<client, invoice>. See http://msdn.microsoft.com/en-us/library/vstudio/bb344977%28v=vs.110%29.aspx Console.WriteLine("Company: {0} (id: {1})", invGroup.Key.companyname, invGroup.Key.id); foreach (invoice inv in invGroup) { Console.WriteLine("\t Invoice reference: {0}", inv.invoicereference); Console.WriteLine("\t\t Invoice date: {0}", inv.invoicedate.Value.ToString("dd/MM/yyyy")); Console.WriteLine("\t\t Invoice amount: {0}", inv.invoiceamount.Value.ToString("C")); Console.WriteLine("\t\t Charge type: {0}", inv.chargetypes.chargetypename); } }