Получить размер FileStream (sql server) по контексту приложения mvc asp net mvc - PullRequest
0 голосов
/ 10 декабря 2018

Хотелось бы, чтобы .net (asp.net mvc) предоставил возможность получить размер FileStream, имеющий DbContext.Пока я проводил исследования, я могу:

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 Cenarius


ОБНОВЛЕНИЕ 10.12.2018

Суть моей помощи заключалась в том, чтобы получить более высокую производительность, потому что SUM (DATALENGTH (...) был медленным. Думая о c #, я предположил, что яможет помочь ускорить запрос. Однако, после прочтения многих статей в Google, лучшим решением было использовать любой способ sys.database_files.

Спасибо за помощь.

BR

Кенарий

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

Многие встроенные функции SQL Server доступны через SqlFunctions в Entity Framework до 6.2 и DbFunctions в EF Core 2.1

В EF 6.2, SqlFunctions.DataLength может использоваться для возврата размера любого поля.Например:

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

Функция, к сожалению, не доступна в EF Core.Альтернативой может быть использование типов запросов и запросов необработанного SQL для выполнения запроса необработанного 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 и другие операторы.

В версиях EF Core до 2.1 все еще можно выполнять необработанные запросы SQL, но они 'придется сопоставлять с классами сущностей.

0 голосов
/ 10 декабря 2018

Попробуйте использовать Length свойство класса Stream, чтобы получить размер текущего файла в байтах:

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

Пожалуйста, прочтите описание FileStream.Length на MSDN:

Получает длину в байтах потока

Обновление:

Если вы используете EntityFramework, затем используйте SqlFunctions:

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