【问题标题】:Get FileStream size (sql server) by mvc app context asp net mvc通过 mvc app context asp net mvc 获取 FileStream 大小(sql server)
【发布时间】:2018-12-10 10:37:55
【问题描述】:

我希望 .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 塞纳留斯


2018 年 12 月 10 日更新

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

感谢您的帮助。

BR

塞纳留斯

【问题讨论】:

  • 为什么要使用 LINQ 进行这样的查询?本例中不涉及任何对象,只是一个报告查询。 BTW sys.database_files 是关于 database 文件,而不是文件流值
  • 如果你想获得一个文件的大小,请使用SELECT DATALENGTH(filestreamcolumn) FROM filestreamtableDATALENGTH('ColumnName') 返回 ASCII 字符串 'ColumnName' 的长度。 SUM(DATALENGTH(filestreamcolumn)) 返回查询中所有个文件的总大小
  • @Cenarious 您使用的是哪个 EF 版本? EF 核心?英孚 6 号?另一个?
  • 可能重复 Using entity framework, how do you select the datalength of a column plus other column data。答案是使用SqlFunctions.DataLength,例如dc.X.Select(x => new { Length = SqlFunctions.DataLength(x.B), A = x.A });

标签: sql sql-server asp.net-mvc entity-framework filestream


【解决方案1】:

许多 SQL Server 内置函数可通过 6.2 及以下 Entity Framework 中的 SqlFunctions 和 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 查询,但它们必须映射到实体类。

【讨论】:

    【解决方案2】:

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

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

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

    获取流的字节长度

    更新:

    如果您使用EntityFramework,则使用SqlFunctions

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

    【讨论】:

    • 数据库已经提供了该信息。打开 100 个文件只是得到它们的长度是非常昂贵的
    • @PanagiotisKanavos 是的,它非常昂贵,但 OP 想知道如何去做。他已经知道如何通过 SQL 查询来实现这一点。
    • 方法是SELECT DataLength(Column)。这应该是原始 SQL 查询还是 EF 中的映射函数调用是另一回事。
    • @PanagiotisKanavos 谢谢,如果你同意将你的角色评论添加到回复中,我会添加到答案中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-27
    • 1970-01-01
    • 2016-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多