首页 文章

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

提问于
浏览
1

我想如果.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

    尝试使用 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 });
    
  • 1

    许多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查询,但它们必须映射到实体类 .

相关问题