2013-10-24 23 views
2

訪問一個BLOB文件中使用LINQ數據庫是這樣的:使用SQL Server文件流與LINQ

var query = from file in database 
where file.FileID = fileId 
select file; 

當我激活文件流在此表LINQ通過T-SQL查詢數據庫。在較大的文件上這是一個不好的做法。

根據此網站:http://www.codeproject.com/Articles/128657/How-Do-I-Use-SQL-File-Stream它應該完成與SqlCommand,查詢路徑,然後直接訪問文件SqlFileStream

Select FileData.PathName() As Path, 
GET_FILESTREAM_TRANSACTION_CONTEXT() As TransactionContext 
From PictureTable Where PkId = (Select Max(PkId) From PictureTable) 

現在就可以訪問該文件的雨衣(更多 「LINQ-ER」)的方式?

回答

0

最終,這不會是LINQ查詢,因爲您必須將LINQ查詢轉換爲傳統SQL查詢(使用DataContext.GetCommand)並從SqlCommand調用BeginExecuteReader。

public class TerrasoftFiles : ITerrasoftFiles 
{ 
    public TerrasoftFiles() 
    { 
     this.sqlConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["TTDataReader"].ConnectionString); 
     this.sqlCommand = new SqlCommand(@"SELECT FileData FROM tbl_Files WHERE ID = @ID", sqlConnection); 
    } 

    private SqlConnection sqlConnection; 
    private SqlCommand sqlCommand; 

    public IAsyncResult BeginGetFiles(Guid ID, AsyncCallback asyncCallBack, object asyncState) 
    { 
     sqlCommand.Parameters.Add(new SqlParameter("@ID", ID)); 

     sqlConnection.Open(); 

     return sqlCommand.BeginExecuteReader(asyncCallBack, asyncState); 
    } 

    public Stream EndGetFiles(IAsyncResult asyncResult) 
    { 
     using(sqlConnection as IDisposable) 
      using (sqlCommand as IDisposable) 
       using (var Reader = sqlCommand.EndExecuteReader(asyncResult)) 
       { 
        return (Reader.Read()) ? Reader.GetSqlBytes(0).Stream : Stream.Null; 
       } 
    } 
} 
+0

那麼您的示例查詢可以在LINQ中使用,併爲我提供像SQLCommand一樣的數據。但我想用LINQ查詢SQL-PathName()。所以我可以直接訪問文件並繞過DBMS。 – Vulcano

+0

也許這[article](http://www.bluelemoncode.com/post/2011/11/16/Upload-and-Download-files-in-database-using-MVC-Linq-to-SQL.aspx)是適合你的情況 – StuS

+1

不幸的不是真的。您的文章將數據直接保存在表格中。對於低於1MB的文件,這適用於較大的文件。你檢查過「新」Filestream功能嗎?它的一種真棒,一旦它工作:) https://www.simple-talk.com/sql/learn-sql-server/an-introduction-to-sql-server-filestream/ – Vulcano