当我在EF 5中使用此存储过程时,它始终返回0

时间:2015-01-02 15:43:16

标签: c# sql entity-framework visual-studio-2012 sql-server-2012

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中使用此存储过程时,它始终返回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。我第一次看到这个问题。

感谢您的关注

2 个答案:

答案 0 :(得分:2)

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

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

对结果的ToString()调用看起来很可疑,因为返回值是T的ObjectResult。它似乎是可枚举/列表实现的包装器。它可能不会从存储过程返回缩放器结果集的字符串表示形式。我认为这条线看起来应该更像:

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

答案 1 :(得分:0)

不知道您是否确实传入了有效的身份证明。但试试:

将NoCount设为

作为你的第一行?这可能是罪魁祸首。

一般来说,这是一个标量函数吗?更适合你正在做的事情。