Reputation: 1643
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
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
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