Raw SQL Query without DbSet - Entity Framework Core

后端 未结 17 1433
眼角桃花
眼角桃花 2020-11-22 13:27

With Entity Framework Core removing dbData.Database.SqlQuery I can\'t find a solution to build a raw SQL Query for my full-text search query th

17条回答
  •  佛祖请我去吃肉
    2020-11-22 13:41

    You can execute raw sql in EF Core - Add this class to your project. This will allow you to execute raw SQL and get the raw results without having to define a POCO and a DBSet. See https://github.com/aspnet/EntityFramework/issues/1862#issuecomment-220787464 for original example.

    using Microsoft.EntityFrameworkCore.Infrastructure;
    using Microsoft.EntityFrameworkCore.Internal;
    using Microsoft.EntityFrameworkCore.Storage;
    using System.Threading;
    using System.Threading.Tasks;
    
    namespace Microsoft.EntityFrameworkCore
    {
        public static class RDFacadeExtensions
        {
            public static RelationalDataReader ExecuteSqlQuery(this DatabaseFacade databaseFacade, string sql, params object[] parameters)
            {
                var concurrencyDetector = databaseFacade.GetService();
    
                using (concurrencyDetector.EnterCriticalSection())
                {
                    var rawSqlCommand = databaseFacade
                        .GetService()
                        .Build(sql, parameters);
    
                    return rawSqlCommand
                        .RelationalCommand
                        .ExecuteReader(
                            databaseFacade.GetService(),
                            parameterValues: rawSqlCommand.ParameterValues);
                }
            }
    
            public static async Task ExecuteSqlQueryAsync(this DatabaseFacade databaseFacade, 
                                                                 string sql, 
                                                                 CancellationToken cancellationToken = default(CancellationToken),
                                                                 params object[] parameters)
            {
    
                var concurrencyDetector = databaseFacade.GetService();
    
                using (concurrencyDetector.EnterCriticalSection())
                {
                    var rawSqlCommand = databaseFacade
                        .GetService()
                        .Build(sql, parameters);
    
                    return await rawSqlCommand
                        .RelationalCommand
                        .ExecuteReaderAsync(
                            databaseFacade.GetService(),
                            parameterValues: rawSqlCommand.ParameterValues,
                            cancellationToken: cancellationToken);
                }
            }
        }
    }
    

    Here's an example of how to use it:

    // Execute a query.
    using(var dr = await db.Database.ExecuteSqlQueryAsync("SELECT ID, Credits, LoginDate FROM SamplePlayer WHERE " +
                                                              "Name IN ('Electro', 'Nitro')"))
    {
        // Output rows.
        var reader = dr.DbDataReader;
        while (reader.Read())
        {
            Console.Write("{0}\t{1}\t{2} \n", reader[0], reader[1], reader[2]);
        }
    }
    

提交回复
热议问题