2

使用 LINQ 访问数据库中的 BLOB 文件的工作方式如下:

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

当我在此表上激活 Filestream 时,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”)的方式访问文件吗?

4

1 回答 1

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;
                }
    }
}
于 2013-10-24T06:46:12.403 回答