【问题标题】:MSSQL Stored Proc and .FromSql with EntityFrameWorkCore 2MSSQL 存储过程和 .FromSql 与 EntityFrameWorkCore 2
【发布时间】:2018-04-23 15:21:08
【问题描述】:

我有如下调用存储过程的方法;

    public IList<Trader> GetTradersWithinRadius(int category, decimal latitude, decimal longitude)
    {
        var sproc = "FindTradersWithinRadiusLatLong";
        var sqlParams = new List<SqlParameter>()
        {
            new SqlParameter("@CATEGORY", category),
            new SqlParameter("@LAT", latitude),
            new SqlParameter("@LONG", longitude),
        };
        var parameters = sqlParams.ToArray<object>();

        var traders = this.Traders.FromSql($"{sproc} @CATEGORY, @LAT, @LONG", parameters).ToList();

        return traders;
    }

现在如果我直接在 SQL Management Studio 中执行存储过程;

EXEC    @return_value = [FindTradersWithinRadiusLatLong]
        @LAT = 43.590000,
        @LONG = -111.120000,
        @CATEGORY = 1

我得到一个结果。但是,当我调用上述方法时,会返回一个空集?

交易者类是;

public class Trader : AuditableEntity
{
    public string Name { get; set; }
    public string Telephone { get; set; }
    public string Email { get; set; }
    public string Website { get; set; }

    public List<Profile> Profiles { get; set; }

    public List<Address> Addresses { get; set; }
    public List<Contact> Contacts { get; set; }

    public List<TraderCategory> Categories { get; set; }

    public string Notes { get; set; }

    public List<TraderGallery> Gallery { get; set; }

    public List<Review> Reviews { get; set; }

    public TraderReviewStatistic ReviewStatistic { get; set; }

    public ApplicationUser User { get; set; }
}

它没有生成我通过 MSSQL 管理器获得的列表有什么原因吗?

【问题讨论】:

  • 当您尝试调用 GetTradersWithinRadius 时的响应是什么?它是空的吗?你怎么称呼它?
  • @AussieJoe 没有错误,只是一个空的结果集。我将截图结果
  • 你检查过实体框架生成的SQL吗?您可以使用 SQL Profiler 在服务器/SQL 端检查这些参数值吗?另外,是否需要“.ToArray()”?看来您可以避免这种情况。

标签: c# sql-server entity-framework asp.net-core-2.0


【解决方案1】:

我认为问题在于您如何编写查询。至少,你让它变得比它需要的更困难。 FromSql 可以开箱即用地处理命名参数,只需传递值(它使用相对位置来确定哪个值被替换)。长短,试试看:

var traders = this.Traders.FromSql($"{sproc} @CATEGORY, @LAT, @LONG", category, latitude, longitude).ToList();

无需创建一个显式的SqlParameters 数组。

【讨论】:

  • 有趣的是,如果我这样做,我会收到错误Must declare the scalar variable "@CATEGORY". must the params match the order they are listed in the stored procedure?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-15
  • 1970-01-01
  • 1970-01-01
  • 2018-12-23
  • 1970-01-01
  • 2011-04-18
  • 2011-04-02
相关资源
最近更新 更多