从存储过程中读取单个BLOB条目

时间:2018-11-27 13:53:13

标签: c# asp.net-core

我只需要使用存储过程来完成任务。

在我的应用程序中,我有称为“文档”和“ DocumentInfo”的模型,它们引用mysql表。例如,我有最简单的存储过程来按文件名获取documentInfo列表:

SQL:

CREATE PROCEDURE `GetDocumentByName` (DocName varchar(255))
BEGIN
Select * from GetAllDocuments where DocumentName like DocName;
END$$

C#:

public List<DocumentsInfo> GetDocumentByName(string Filename)
{
    return db.DocumentsInfo.FromSql("CALL GetDocumentByName({0})", Filename).ToList();
}

如您所见,我使用db-这是dbContext。 DocumentsInfo是我的模型,我返回了DocumentsInfo对象的列表。但是,如果我不需要返回整个对象而只返回一列怎么办?

现在我需要做同样的事情,但是要使用'Document',但是只有这次我只需要填写一个字段-DocumentBody,它是BLOB

SQL:

CREATE PROCEDURE `GetDocumentBodyById` (DocumentBodyID INT(11))
BEGIN
Select DocumentBody from Document where idDocumentBody = DocumentBodyID;
END$$

C#:

var test = db.FromSql("CALL GetDocumentBodyById({0})", DocumentID).FirstOrDefault();

给我一​​个错误:

  

'DBContext'不包含'FromSql'的定义,并且不   可访问的扩展方法'FromSql',它接受第一个参数   可以找到类型“ DBContext”(您是否缺少using指令或   组装参考?)

也尝试使用此选项:

var test = db.Database.SqlQuery<object>("CALL GetDocumentBodyById({0})", DocumentID).FirstOrDefault();

但收到新的错误:

  

“ DatabaseFacade”不包含“ SqlQuery”的定义,并且没有   可访问的扩展方法'SqlQuery'

如何调用仅返回一个值而不返回整个模型对象的存储过程? .net core可能吗?

1 个答案:

答案 0 :(得分:1)

对于FromSql,它与Query一起使用,您可以定义一个新的返回结果模型。

    public class ResultDto
{
    public string Name { get; set; }
}

Query中定义OnModelCreating

        protected override void OnModelCreating(ModelBuilder builder)
    {
        base.OnModelCreating(builder);

        builder.Query<ResultDto>();
    }

用法:

  var result = _context.Query<ResultDto>().FromSql("exec GetDocumentBodyById {0}", 1).ToList();