MSSQL存储过程和.FromSql与EntityFrameWorkCore 2

时间:2018-04-23 15:21:09

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

我有以下方法来调用存储过程;

    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

screenshot mssql

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

visual studio screenshot

Trader类是;

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 Manager获得的列表?

1 个答案:

答案 0 :(得分:1)

我认为问题在于你如何撰写查询。至少,你使它变得比它需要的更困难。 FromSql可以直接处理命名参数,只需传递值(它使用相对位置来确定哪个值代替了什么)。长短,试试:

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

无需创建SqlParameter s的显式数组。