Search code examples
c#linq-to-entitiesmultiple-columnswhere-in

LINQ to Entities - where..in clause with multiple columns


I'm trying to query data of the form with LINQ-to-EF:

class Location {
    string Country;
    string City;
    string Address;
    …
}

by looking up a location by the tuple (Country, City, Address). I tried

var keys = new[] {
    new {Country=…, City=…, Address=…},
    …
}

var result = from loc in Location
             where keys.Contains(new {
                 Country=loc.Country, 
                 City=loc.City, 
                 Address=loc.Address
             }

but LINQ doesn't want to accept an anonymous type (which I understand is the way to express tuples in LINQ) as the parameter to Contains().

Is there a "nice" way to express this in LINQ, while being able to run the query on the database? Alternately, if I just iterated over keys and Union()-ed the queries together, would that be bad for performance?


Solution

  • How about:

    var result = locations.Where(l => keys.Any(k => 
                        k.Country == l.Country && 
                        k.City == l.City && 
                        k.Address == l.Address));
    

    UPDATE

    Unfortunately EF throws NotSupportedException on that, which disqualifies this answer if you need the query to run on DB side.

    UPDATE 2

    Tried all kinds of joins using custom classes and Tuples - neither works. What data volumes are we talking about? If it's nothing too big, you could either process it client-side (convenient) or use unions (if not faster, at least less data is transmitted).