通过 mvc app context asp net mvc 获取 FileStream 大小(sql 服务器)

Get FileStream size (sql server) by mvc app context asp net mvc

我希望 .net (asp.net mvc) 提供获取具有 DbContext 的 FileStream 大小的可能性。正如我目前所做的研究,我可以:

1) SELECT SUM(DATALENGTH('ColumnName'))FROM Table

2)

SELECT DB_NAME() AS [DBNAME], size / 128 AS [Size in MB]
FROM sys.database_files
WHERE type = 2;

我的问题是我是否可以使用 C# 计算文件流。我通过 DbContext 连接到数据库。我可以得到尺码吗?

请帮助我。 BR 塞纳留斯


2018 年 12 月 10 日更新

我的帮助点是获得更高的性能,因为 SUM(DATALENGTH(...) 很慢。考虑到 c#,我想我可能有助于加快查询速度。但是最好的解决方案,在阅读了很多文章之后在 google 上,是如何使用 sys.database_files.

感谢您的帮助。

BR

塞纳留斯

尝试使用 Length 属性 of Stream class 来获取当前文件的大小,以字节为单位:

long length;
using (Stream stream = new FileStream(filePath, FileMode.Open))
{
    length = stream.Length;
}

Please, read a description of FileStream.Length at MSDN:

Gets the length in bytes of the stream

更新:

如果使用EntityFramework,则使用SqlFunctions

var fieldLength = yourContext.yourTable.Select(x => 
    new { Length = SqlFunctions.DataLength(x.B), A = x.A });

许多 SQL 服务器内置函数可通过 EF Core 2.1SqlFunctions in Entity Framework up to 6.2 and DbFunctions 获得

在 EF 6.2 中,SqlFunctions.DataLength 可用于 return 任何字段的大小。例如:

var files = myContext.Select(row=>
                       new { 
                            row.Name,
                            Size=SqlFunctions.DataLength(row.File)
                           })
                     .ToArray();

不幸的是,该功能在 EF Core 中不可用。另一种方法是使用 Query Types and raw SQL queries 执行原始 SQL 查询并将其映射到查询类型:

class FileAndSize
{
    public string Name{get;set;}
    public long Size {get;set;}
}


var files = myContext.Query<FileAndSize>
                     .FromSql("select name,datalength(file) as size from ...")
                     .Where(...)
                     .ToList();

原始 SQL 查询可以与 LINQ 运算符组合以创建最终的 SQL 语句,它允许添加 Where()GroupBy 和其他运算符。

在 2.1 之前的 EF Core 版本中,仍然可以执行原始 SQL 查询,但它们必须映射到实体 类.