EFcore3.1 从 sys.master_files 和 SERVERPROPERTY 获取值

EFcore3.1 get values from sys.master_files and SERVERPROPERTY

我需要我的(控制台)应用程序来获取一些常规的 SQLserver 数据库信息。

在 SQLserver management studio 中,我 运行 在 master 系统数据库上查询:

SELECT @@VERSION, name, physical_name, size, SERVERPROPERTY('Edition'), SERVERPROPERTY('ProductVersion'), SERVERPROPERTY('MachineName')
FROM sys.master_files
WHERE name = 'mydb'

我得到一个 table 单行和 7 列我需要的值

如何从 EFcore 执行此操作?

我知道我需要使用 ExecuteSqlRaw,因为我没有也不想要 DBContext,但是我不确定
- 如何在主系统 table 上执行它?和
- 如何得到结果? (因为字符串很好)

感谢任何帮助

我最终是这样解决的:

var server = "localhost";
var username = "user";
var password = "password";
var conString = "Server=" + server + ";Database=master;User Id=" + username +";Password=" + password;

string version="", machineName="", physicalName="";
float mydbDataFileSizeGB=-1, maxSizeGB=-1;

try {
    using SqlConnection con = new SqlConnection(conString);
    con.Open();
    var query = @"
        SELECT  
            @@VERSION AS Version, 
            SERVERPROPERTY('MachineName') AS MachineName, 
            physical_name AS PhysicalName,
            CAST(CASE WHEN type = 0 THEN size * 8. / 1024.0  / 1024.0 ELSE 0 END AS DECIMAL(8,2)) AS MydbDataFileSizeGB,
            CAST(CASE WHEN serverproperty('EngineEdition') = 4 THEN  CASE WHEN SERVERPROPERTY('productversion') between '10.50' and '5' THEN 10 ELSE 4 END ELSE -1 END  AS DECIMAL(8,2)) AS MaxSizeGB
        FROM sys.master_files
        WHERE name = 'Mydb_Data'
    ";

    using SqlCommand cmd = new SqlCommand(query, con);
    SqlDataReader rdr = cmd.ExecuteReader();

    if (rdr.Read()) {
        version = rdr.GetString(0);
        machineName = rdr.GetString(1);
        physicalName = rdr.GetString(2);
        mydbDataFileSizeGB = decimal.ToSingle(rdr.GetDecimal(3));
        maxSizeGB = decimal.ToSingle(rdr.GetDecimal(4));
    }

} catch (Exception) {
    ...
}

要在 EFCore 3.1 中执行此操作,您需要创建一个模型来表示您尝试检索的数据,然后使用 FromSqlRaw 或 FromSqlInterpolated 来填充该模型。

您将需要使用 DbContext 来执行此操作。因此,如果这是您的硬性要求,那么像您所做的那样求助于 ADO.NET 是一种方法。

ExecuteSqlRaw/ExecuteSqlInterpolated 只会 return 一个整数结果。