LINQ: Generate "AND" Expression instead of "OR" when using "CONTAINS"

I have this List:

string[] countries = {
        "USA",
        "CANADA"
    };

When I run this query :

query = (from user in db where
         user.Orders.Any(order => order.Price > 10 &&
                                      countries.Contains(order.DestinationCountry)))

Output is a list of users that have Orders sent to "USA" OR "Canada".

but I want the list of users that have Orders sent to both "USA" AND" "CANADA".

I can do this using below code but i'm searching for a pure linq solution without any ForEach:

foreach (country in countries) {
    query = (from user in query where
             user.Orders.Any(order => order.Price > 10 &&
                                      order.DestinationCountry == country));
}

Answers:

A. Using .Aggregate()

Generated query is just like For Each.

B.where countries.All(c => user.Orders.Any(o => o.Price > 10 && o.DestinationCountry == c))

When there is no element in Countries List (When I want all users based only on Price parameter), the result is not correct and other parameter is not considered!


Update 1:

I have tried .All() instead of .Contains() before posting and it returns 0 users.

Update 2:

I have updated my question to make it closer to the real problem.

lets say Country is not the only parameter.

Update 3:

Checked some answers and added the result to my question.

Jon Skeet
people
quotationmark

So you want a list of the users such that all the countries in the list are present in the set of order destinations?

Logically, that would be:

query = from user in db
        where countries.All(c => user.Orders.Any(o => o.DestinationCountry == c))
        select ...;

However, I'm not confident that EF will do what you want with that. It's not clear to me what the right SQL query would be to start with - in a simple way, at least.

people

See more on this question at Stackoverflow