I am building an IQueryable based on parameters I get from the user. One of those parameters is a multi-select and I need to retrieve records that contain any of the selected values.
The code that deals with that is:
var ids = parameters.DeliveryID.ToArray();
courses = courses.Where(c => ids.Contains(c.CourseDeliveryID));
In the above code:
1. ids – is a byte array and I make sure it has multiple values before calling Contains().
2. c.CourseDeliveryID – that’s a byte value.
In the database I store CourseDeliveryID as tinyint (SQL Server 2008).
Compilation is just fine.
When I run the code I get the following ArgumentException:
DbExpressionBinding requires an input expression with a collection ResultType.
Parameter name: input
I found the documentation for that exception here:
http://technet.microsoft.com/en-us/library/system.data.common.commandtrees.expressionbuilder.dbexpressionbuilder.bindas.aspx
While trying to solve the problem I found that if I use the same code on shorts, ints or longs I don’t have any problem.
I’m in touch with Microsoft about it since yesterday and will update when I know more, but in the meantime I figured I’d throw it also here to get more advises if possible.
Thanks in advance!
I was able to reproduce your error in LINQPad, and found that using a
List<byte>instead of abyte[]would work:will generate the following sql and return results:
It’s also interesting that using an
int[]orshort[]would also work, producing this sql:but using a
byte[]causes an exception. I can only guess that the SQL Server EF provider is trying to treatbyte[]in some special way, resulting in this exception.