Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在EF中调用SP时无法将类型T转换为T[]_C#_Asp.net_Entity Framework - Fatal编程技术网

C# 在EF中调用SP时无法将类型T转换为T[]

C# 在EF中调用SP时无法将类型T转换为T[],c#,asp.net,entity-framework,C#,Asp.net,Entity Framework,我有一个名为“prcGetCoAddress”的简单SP,它使用参数进行记录数返回和地址搜索 ALTER PROCEDURE [dbo].[prcGetCOBAddress] @NumberOfRecord int, @FullAddress nvarchar(255) AS BEGIN SET NOCOUNT ON; DECLARE @fullAdd nvarchar(255) DECLARE @numRec int SET @fullA

我有一个名为“prcGetCoAddress”的简单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....

    }
}
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;
}
最后,我创建了一个如下所示的web服务,以从如下所示的EF调用此存储过程

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

    }
}
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[]。

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

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返回所述的
AddressALL
实体。

返回结果处的错误消失,但仍然在“result=database.prcGetCOBAddress(NumberOfRecords,AddressInput).ToArray()处出错@MikeJun您可能仍然缺少变量声明中的方括号。我确实使用了方括号,但在“return database.prcGetCOBAddress…”中仍然出现错误,在添加时显示相同的错误消息。选择该选项可以工作,但看起来像是重复和浪费代码。我已经在AddressAll类中定义了列,我不明白为什么需要使用Select来匹配AddressAll类中的列。prcGetCOBAddress(NumberOfRecords,AddressInput).Select(p=>newAddressAll{UID_NUM=(double)p.UID_NUM和more}).ToArray()@MikeJun似乎没有从
prcGetCOBAddress
方法返回
AddressALL
类型的对象。Duck类型在C#中不起作用。如果两个类具有相同的属性,则类仍然是不同的。