通过 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 查询,但它们必须映射到实体 类.
我希望 .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 查询,但它们必须映射到实体 类.