通过mvc app context asp net mvc获取FileStream大小(sql server)

我想如果.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连接到db . 我可以得到尺码吗?

请帮我 . BR塞纳留斯


更新10.12.2018

我的帮助是为了获得更高的性能,因为SUM(DATALENGTH(...)很慢 . 考虑到c#我认为我可以帮助加快查询 . 但是,在阅读谷歌上的许多文章后,最好的解决方案是使用任何 sys.database_files.

感谢帮助 .

BR

塞纳留斯

回答(2)

2 years ago

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

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

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

获取流的长度(以字节为单位)

Update:

如果您使用 EntityFramework ,则使用 SqlFunctions

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

2 years ago

许多SQL Server内置函数可通过实体框架中的SqlFunctions获得,最高可达6.2和EF Core 2.1中的DbFunctions

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

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

遗憾的是,该功能在EF Core中不可用 . 另一种方法是使用Query Typesraw 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查询,但它们必须映射到实体类 .