I am using Entity Framework 4.0 and I want to use the following query:
To do that I do the following:
strSQLQuery = "select * from MyTable where IDData IN (@IDs)";
lstParameters.Clear();
myParameter = new SqlParameter("@IDs", strIDs);
lstParameters.Add(myParameter);
myContext.MyTable.SqlQuery(strSQLQuery, lstParameters.ToArray<object>()).ToList<MyTable>();
But I get an exception that say that it is not possible to convert nvarchar to bigint.
That is because the parameter is the type string, and the IDs in the table are bigint.
I try to create a list of long and add some IDs, but I get other error.
How can I use a list o IDs as parameter in a query?
I would like to use parameters, if that is possible.
Thanks.
EF builds and executes a parameterized query in the database if the LINQ-to-Entities query uses parameters, such as below.
FromSqlRaw method ( DbSet. FromSql prior to Entity Framework Core 3.0) enables you to pass in a SQL command to be executed against the database to return instances of the type represented by the DbSet : public class Book.
This feature was introduced in EF Core 7.0. var overAverageIds = context.Database .SqlQuery<int>($"SELECT [BlogId] AS [Value] FROM [Blogs]") .Where(id => id > context.Blogs.Average(b => b.BlogId)) .ToList(); FromSql can be used with any scalar type supported by your database provider.
Use the DbSet. Add method to add a new entity to a context (instance of DbContext ), which will insert a new record in the database when you call the SaveChanges() method.
There are a few problems with your code.
First off, to fix your data type error, you'd have to convert strIDs to integers before doing anything else. This should work
var ids = strIDs.Select(s => long.Parse(s));
Now, since you're using entity framework already, why not use Linq instead of creating a SQL query?
var results =
    from r in myContext.MyTable
    where ids.Contains(r.IDData)
    select r;
Or in fluent syntax
var results = myContext.MyTable.Where(r => strIDs.Contains(r.IDData));
But if you really want to use SQL, the IN operator does not support parameters like that. You'd have to write it like this:
strSQLQuery = "select * from MyTable where IDData IN(@ID1, @ID2, @ID3, ...)";
So to do this without too much effort, you can generate your query from ids like this:
strSQLQuery = "select * from MyTable where IDData IN(" + String.Join(", ", ids.Select((s, i) => "@ID" + i)) + ")";
foreach(var parameter in ids.Select((s, i) => new SqlParameter("@ID" + i, s)))
{
    lstParametros.Add(parameter);
}
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With