【问题标题】:How to execute a stored procedure join without creating a new asp.net model?如何在不创建新的 asp.net 模型的情况下执行存储过程连接?
【发布时间】:2019-09-07 16:06:30
【问题描述】:

我正在 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());
            }
    }

我想以正确的方式做到这一点。没有模型有没有办法做到这一点?还是我以正确的方式解决这个问题?

【问题讨论】:

  • 如果你想使用存储过程看here但是你的查询仍然可以使用实体框架执行

标签: c# sql asp.net-mvc stored-procedures


【解决方案1】:

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

每当我只是简单地选择数据时,我都会使用 EF 直接对表进行非常简单的查询,或者为任何连接创建数据库视图等。这可以在 EF 中完成,但无论如何它都太糟糕了, IMO 这些任务属于数据库,正确的工具,正确的工作。如果您使用的是代码优先,那么让您的 Views 有点复杂,如果您这样做,请告诉我。

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)为状态码/标量值返回一个简单的布尔值,或者我必须在进行任何更新后返回一个结果集。

这会返回一个列表

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();

希望这会有所帮助!

【讨论】:

  • 感谢先生抽出宝贵时间分解,非常感谢!
猜你喜欢
  • 2010-11-07
  • 2017-02-07
  • 2020-07-28
  • 2015-09-04
  • 2016-06-12
  • 2018-09-12
  • 2016-09-28
  • 2019-07-06
相关资源
最近更新 更多