gpt4 book ai didi

c# - 如何在不创建新的 asp.net 模型的情况下执行存储过程连接?

转载 作者:太空宇宙 更新时间:2023-11-03 14:39:36 25 4
gpt4 key购买 nike

我正在 SQL Server 数据库中创建存储过程,但在调用时返回数据时遇到问题。

我已经设法让它工作了,但感觉就像是一项黑客工作,而且我做错了。请查看下面的代码,让我知道是否有更好的方法来执行此操作。感谢您花时间帮助我。

create procedure FetchSumOfEmpSalariesByCity
as
begin
select
sum(e.SAL) as TotalSalary, d.LOC as Location
from
EMPS e
join
DEPTs d on e.DEPTNO = d.DEPTNO
group by
d.LOC
end
    public class SumOfEmpsSalaryByCity
{
[Key]
public int TotalSalary { get; set; }
public string Location { get; set; }
}

[HttpGet]
[Route("salary")]
public IHttpActionResult GetEMPsSal()
{
using (var db = new KemmitContext())
{
var sp = db.SumOfEmpsSalaryByCities.SqlQuery("FetchSumOfEmpSalariesByCity");
return Ok(sp.ToList());
}
}

我想以正确的方式做到这一点。有没有办法在没有模型的情况下做到这一点?或者我这样做的方式正确吗?

最佳答案

我把这些任务分解成这样;它应该使用 EF 还是在数据库中完成?如果它在数据库中,它应该是 View 还是 Sp?

每当我只是选择数据时,我都会使用 EF 直接访问表进行非常简单的查询,或者我为任何连接创建一个数据库 View 等。这可以在 EF 中完成,但在任何情况下都非常糟糕, IMO 这些任务属于数据库,正确的工具,正确的工作。如果您使用的是代码优先,那么让您的 View 得到理解会有点复杂,如果您正在这样做,请告诉我。

var model = db.v_ObservationAutoComplete // This can be direct to a table or a view
.Where(oa => oa.Observation.Contains(term))
.OrderBy(oa => oa.Observation)
.Select(oa => new
{
label = oa.Observation
}).Take(10);

当我必须更新单个表中的内容时,我使用 EF

t_Section eSection = new t_Section
{
SectionId = model.SectionId,
Section = model.Section,
SectionTypeId = model.SectionTypeId,
SectionOrdinal = model.SectionOrdinal,
ModifyDate = DateTime.Now,
ModifyUserName = User.Identity.Name,
LastChangeId = newChangeId
};

db.Entry(eSection).State = EntityState.Modified;
db.SaveChanges();

如果我必须进行多表更新,我有几种不同的方法; 1) 为状态代码/标量值返回一个简单的 bool 值,或者我必须在完成我所做的任何更新后返回一个结果集。

返回一个列表

List<string> elements = new List<string>();

try
{
SqlParameter[] parms = new[]
{
new SqlParameter("mpid", myProtocolsId),
new SqlParameter("elid", elementId)
};
elements = db.Database.SqlQuery<string>("p_MyProtocolsOverviewElementRemove @myProtocolsId = @mpid, @elementId = @elid", parms).ToList();

return Json(elements);
}
catch (Exception e)
{
return Json(null);
}

如果我只需要返回一个简单的值,像这样;

SqlParameter[] parms = new[]
{
new SqlParameter("chid", changeId),
new SqlParameter("prid", change.ObjectId),
new SqlParameter("psid", change.ProtocolSectionId),
new SqlParameter("inid", change.SecondaryObjectId),
new SqlParameter("acun", User.Identity.Name)
};
result = db.Database.SqlQuery<int>("p_MyProtocolsContentUpdateInterventionAdd @changeId = @chid, @protocolId = @prid, @protocolSectionId = @psid, @interventionId = @inid, @acceptUserName = @acun", parms).FirstOrDefault();

希望这对您有所帮助!

关于c# - 如何在不创建新的 asp.net 模型的情况下执行存储过程连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57835389/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com