C# 在EF中调用SP时无法将类型T转换为T[]
我有一个名为“prcGetCoAddress”的简单SP,它使用参数进行记录数返回和地址搜索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
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#中不起作用。如果两个类具有相同的属性,则类仍然是不同的。