Raw SQL Query without DbSet - Entity Framework Core

后端 未结 17 1373
眼角桃花
眼角桃花 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:46

    try this: (create extension method)

    public static List ExecuteQuery(this dbContext db, string query) where T : class, new()
            {
                using (var command = db.Database.GetDbConnection().CreateCommand())
                {
                    command.CommandText = query;
                    command.CommandType = CommandType.Text;
    
                    db.Database.OpenConnection();
    
                    using (var reader = command.ExecuteReader())
                    {
                        var lst = new List();
                        var lstColumns = new T().GetType().GetProperties(BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic).ToList();
                        while (reader.Read())
                        {
                            var newObject = new T();
                            for (var i = 0; i < reader.FieldCount; i++)
                            {
                                var name = reader.GetName(i);
                                PropertyInfo prop = lstColumns.FirstOrDefault(a => a.Name.ToLower().Equals(name.ToLower()));
                                if (prop == null)
                                {
                                    continue;
                                }
                                var val = reader.IsDBNull(i) ? null : reader[i];
                                prop.SetValue(newObject, val, null);
                            }
                            lst.Add(newObject);
                        }
    
                        return lst;
                    }
                }
            }
    

    Usage:

    var db = new dbContext();
    string query = @"select ID , Name from People where ... ";
    var lst = db.ExecuteQuery(query);
    

    my model: (not in DbSet):

    public class PeopleView
    {
        public int ID { get; set; }
        public string Name { get; set; }
    }
    

    tested in .netCore 2.2 and 3.0.

    Note: this solution has the slow performance

提交回复
热议问题