我只需要使用存储过程来完成任务。
在我的应用程序中,我有称为“文档”和“ 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可能吗?
答案 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();