当我在EF中调用SP时,无法将类型T转换为T []

时间:2017-01-05 22:36:07

标签: c# asp.net entity-framework

我有一个名为'prcGetCOBAdress'的简单SP,使用参数记录返回和地址搜索。

ALTER PROCEDURE [dbo].[prcGetCOBAddress] 
    @NumberOfRecord int,
    @FullAddress nvarchar(255)
AS
BEGIN

    SET NOCOUNT ON;

    DECLARE @fullAdd nvarchar(255)
    DECLARE @numRec int

    SET @fullAdd = @fullAddress
    SET @numRec = @numberOfRecord

    SELECT TOP (@numRec)
      ,[UID_NUM]
      ,[ADD_FULL]
      ,[FLOOR]
      ,[POSTALCITY]
      ,[STATE]
      ,[ZIP5]
      ,[IN_OUT], and more...

  FROM [ISD].[dbo].[view_COBADDRESS]
  WHERE [ACTIVE] = 1 AND [ADD_FULL] LIKE '%'+@fullAdd+'%'

END

然后我创建了一个名为'AddressALL'的类,如下所示

namespace GISWebApplication
{
    public class AddressALL
    {
        public double UID_NUM { get; set; }
        public string ADD_FULL { get; set; }
        public string POSTALCITY { get; set; }
and more....

    }
}

最后,我创建了一个类似于下面的Web服务来从EF调用此存储过程,如下所示

public AddressALL[] getAddesses(int NumberOfRecords, string AddressInput)
{
    AddressALL result = new AddressALL();
    try
    {
        using (GISAddressEntities database = new GISAddressEntities())
        {
            result = database.prcGetCOBAddress(NumberOfRecords, AddressInput).ToArray();
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
    return result;
}

但是我有错误说不能在结果行隐式地将AddressALL转换为Address []。

1 个答案:

答案 0 :(得分:0)

您正在将result变量初始化为单个对象,而不是数组:

AddressALL result = new AddressALL();

当您尝试将AddressALL个对象的数组分配给result变量时,会出现错误。使用

AddressALL[] result = null;
// or
AddressALL[] result = new AddressALL[0];

或者只是不使用局部变量来存储结果。如果异常,我也不会返回空数组。因此,您不会知道是否存在错误或仅找不到地址。最好不要捕获错误或将其包装在更高级别的异常中:

public AddressALL[] getAddesses(int NumberOfRecords, string AddressInput)
{
    try
    {
        using (GISAddressEntities database = new GISAddressEntities())
            return database.prcGetCOBAddress(NumberOfRecords, AddressInput).ToArray();
    }
    catch (Exception ex)
    {
        throw new DataAccessException("Failed to load addresses", ex);
    }
}

还有一点需要注意 - 如果您正在创建Web应用程序,那么将错误写入控制台并不是一个好方法:)使用一些日志记录框架并将错误记录到文件中。

更新:您还有另一个问题 - 存储过程返回Address个对象而不是AddressALL个对象。而AddressALL并非来自Address。如果字段集相同,您只需告诉EF按照here所述返回AddressALL实体。