繁体   English   中英

在没有 model 的原始查询中使用 EF7

[英]Using EF7 with raw queries without a model

我想知道是否有一种方法可以像 Dapper 一样以时尚的方式使用 EF7,而无需从数据库生成或以其他方式生成 model。 就像是

using(var context = new DbContext())
{
    string query = "...";
    var val = context.Database.ExecuteSqlCommand<RetVal>(query);
}

如果有办法的话,这看起来像是一个保守的秘密。 这里的想法是使用 EF7 作为 ADO.NET 的精简包装器。

目前,您无法使用EF核心执行此操作

SQL查询只能用于返回属于模型的实体类型

您可以在此处查看限制: 原始SQL查询限制

您可以在EF Core待办事项列表上看到它的增强功能: 支持任意类型的临时映射

实际上,我认为您正在寻找的东西可以完成(在 EF7 以及旧版本的 EF 中)。 您将需要使用命令 object 为您执行查询,然后从命令阅读器解析结果。

这是一个例子:

using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Linq;
using Microsoft.EntityFrameworkCore;

namespace IndexFragmentationExample
{
    public class IndexFragmentation
    {
        public string TableName { get; set; }
        public string IndexName { get; set; }
        public double FragmentationPercent { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            using (var db = new MyDbContext())
            {
                var indexFragmentations = GetIndexFragmentation(db);
                foreach (var indexFragmentation in indexFragmentations)
                {
                    Console.WriteLine("Table: " + indexFragmentation.TableName);
                    Console.WriteLine("Index: " + indexFragmentation.IndexName);
                    Console.WriteLine("Fragmentation: " + indexFragmentation.FragmentationPercent + "%");
                    Console.WriteLine();
                }
            }
        }

        private static List<IndexFragmentation> GetIndexFragmentation(DbContext db)
        {
            var fragmentations = new List<IndexFragmentation>();
            var connection = db.Database.GetDbConnection();
            connection.Open();
            using (var command = connection.CreateCommand())
            {
                command.CommandText = @"
                    SELECT 
                        OBJECT_NAME(ind.OBJECT_ID) AS TableName, 
                        ind.name AS IndexName, 
                        indexstats.avg_fragmentation_in_percent 
                    FROM 
                        sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL, NULL, 'DETAILED') AS indexstats 
                    INNER JOIN 
                        sys.indexes AS ind 
                    ON 
                        ind.OBJECT_ID = indexstats.OBJECT_ID 
                        AND ind.index_id = indexstats.index_id";

                using (var reader = command.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        fragmentations.Add(new IndexFragmentation
                        {
                            TableName = reader["TableName"].ToString(),
                            IndexName = reader["IndexName"].ToString(),
                            FragmentationPercent = Convert.ToDouble(reader["avg_fragmentation_in_percent"])
                        });
                    }
                }
            }
            return fragmentations;
        }
    }

    public class MyDbContext : DbContext
    {
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=MyDb;Trusted_Connection=True;");
        }
    }
}

我希望这有帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM