GrahamJRoy
GrahamJRoy

Reputation: 1643

Using LINQ To Query Int Ids From An Array

I have an array of Ids that I want to pass to the entity framework via a Linq query to return any matches

I have written Linq queries that can convert Ids to strings and use the 'Contains' operator, such as:

Model

public class Order {
  public long OrderId { get; set; }
  public string Name { get; set; } ...}

Order[] orders = { new Order { OrderId = 123, Name = "Order1" }, new Order {...},...};

for which I can use something like:

long[] testArray = {123, 456};

and then

var result = orders.Where(i => testArray.ToString().Contains(i.OrderId.ToString()));

but do I really need to keep casting the Ids to strings? It looks as though I can't access the 'Contains' if I keep them as ints.

Ultimately, I want to be able to use this as part of a query that accesses the Entity Framework and so passes the query as part of an IQueryable<> to make sure I am not returning reams of data when I only want a handfull, such as:

var orders = _repo.Orders().Where(i => orderArray.Contains(i.OrderId));

So any solution it would be useful if the query params (the int array) through the EF rather than getting all of the data and then checking it in memory.

Cheers!

Upvotes: 10

Views: 30336

Answers (2)

Clueless
Clueless

Reputation: 1200

you can use the Intersect operator instead, why do you use arrays and not lists? code example:

      public class Order {
  public long OrderId { get; set; }
  public string Name { get; set; }}


    public class Rep
    {
        private List<Order> orders { get; set; }

        public void Q()
        {
            long[] testArray = {123, 456};
            var res  = orders.Intersect(orders);
        }
    }

Upvotes: 0

Jon Skeet
Jon Skeet

Reputation: 1503280

but do I really need to keep casting the Ids to strings

Absolutely not. It's not clear what bars is, but assuming it should really be orders, you could use:

var result = orders.Where(i => testArray.Contains(i.OrderId));

or perform a join:

var result = orders.Join(testArray, o => o.OrderId, id => id, (o, id) => o);

Upvotes: 21

Related Questions