当我在 EF 5 中使用这个存储过程时,它 returns 总是 0

When I use this stored procedure in EF 5 it returns always 0

ALTER proc [dbo].[ReadReviewCountByHotelId]
@HotelId uniqueidentifier
AS 
-- Returns the review count for given hotel.
BEGIN
    SELECT Count(r.ReviewId) as ReviewCount 
    FROM Review r 
    WHERE r.Review_HotelId = @HotelId
END;

当我在 EF 5 中使用此存储过程时,它 returns 始终为 0。 我其他程序没有问题。

public static int ReadReviewCountByHotelId(Guid? hotelId)
{
    int reviewCount = 0;
    try
    {
        var tEntities = new TravelEntities();
        Int32.TryParse(tEntities.ReadReviewCountByHotelId(hotelId).ToString(),out reviewCount);               
    }
    catch (Exception ex)
    {
        throw new Exception(ex.Message);
    }
    return reviewCount;
}

EF 函数作为

public virtual ObjectResult<Nullable<int>> ReadReviewCountByHotelId(Nullable<System.Guid> hotelId)
{
    var hotelIdParameter = hotelId.HasValue ?
        new ObjectParameter("HotelId", hotelId) :
        new ObjectParameter("HotelId", typeof(System.Guid));

    return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<Nullable<int>>("ReadReviewCountByHotelId", hotelIdParameter);
}

我在我的项目中使用 EF。第一次看到这个问题

感谢您的关注

不知道你是否真的传入了一个有效的id。但是尝试:

开启 NoCount

作为存储过程中的第一行?这可能是罪魁祸首。

一般来说,将其设为标量函数?更适合您的工作。

未检查 TryParse 的 return 值。如果以下行无法解析结果,则它 return 为 false 并且不会更改已初始化为零的 reviewCount 的值。它不会抛出异常。

Int32.TryParse(tEntities.ReadReviewCountByHotelId(hotelId).ToString(),out reviewCount);

对结果的 ToString() 调用看起来很可疑,因为 return 值是 T 的 ObjectResult。这似乎是 enumerable/list 实现的包装器。它可能不是 returning 存储过程中缩放器结果集的字符串表示形式。我认为该行应该更像:

reviewCount = tEntities.ReadReviewCountByHotelId(hotelId).First().Value