Troy Loberger
Troy Loberger

Reputation: 347

Using LINQ to get distinct items that do not join

I'm having problems running a LINQ query between two tables and returning an answer set that doesen't match.

TB_AvailableProducts
-Prod_ID
-Name
....
TB_Purchases
-Cust_ID
-Prod_ID

Is there a way to get all distinct products that a customer has not purchased by using 1 LINQ query, or do I have to be doing two separate queries, 1 for all products and 1 for purchased products, and compare the two?

Upvotes: 2

Views: 120

Answers (1)

Sergey Berezovskiy
Sergey Berezovskiy

Reputation: 236288

This query will return all products, which do not have related record in purchases table.

int customerID = 1;
var query = from ap in context.TB_AvailableProducts
            join p in context.TB_Purchases.Where(x => x.Cust_ID == customerID) 
                 on ap.Prod_ID equals p.Prod_ID into g
            where !g.Any()
            select ap;

I don't think you need Distinct here if you don't have duplicated records in your products table.

Generated SQL query will look like:

SELECT ap.Prod_ID, ap.Name
FROM TB_AvailableProducts AS ap
WHERE NOT EXISTS (SELECT 
    1 AS C1
    FROM TB_Purchases AS p
    WHERE (1 = p.Cust_ID) AND (ap.Prod_ID = p.Prod_ID)
)

Upvotes: 3

Related Questions