在我的 Service1.svc 文件中,我有以下内容;
[OperationContract]
public List<Accounts> GetAllAccounts()
{
string Conn = "......";
List<Accounts> Accs = new List<Accounts>();
SqlConnection _con = new SqlConnection(Conn);
SqlCommand sc = new SqlCommand("SQL QUERY....", _con);
SqlDataReader reader;
_con.Open();
reader = sc.ExecuteReader();
while (reader.Read()) { Accs.Add(new Accounts() { Name = reader["Name"].ToString(), Qty = Convert.ToInt32(reader["Qty"]), Weight = Convert.ToDecimal(reader["Weight"]), Value = Convert.ToDecimal(reader["Value"]) }); }
_con.Close();
return Accs.ToList();
}
public class Accounts
{
public string Name { get; set; }
public int Qty { get; set; }
public decimal Weight { get; set; }
public decimal Value { get; set; }
}
我知道我的SQL是正确的,我已将此列表的内容打印到屏幕以确保数据存在,但我遇到的问题是当我尝试在浏览器中运行服务时 - 它失败了。
现在,我认为这是因为我的 IService.cs 与返回的'List'控件冲突。我得到的错误是;
我的Service1.GetAllAccounts()方法无法实现我的IService1.GetAllAccounts(),因为它没有匹配的返回类型'System ..... List'。
IService1.cs;
[ServiceContract]
public interface IService1
{
[OperationContract]
List<Accounts> GetAllAccounts();
}
public class Accounts
{
public string Name { get; set; }
public int Qty { get; set; }
public decimal Weight { get; set; }
public decimal Value { get; set; }
}
这个问题听起来很简单,但我对C#还不熟悉,有人可以提出建议吗?
答案 0 :(得分:2)
将[DataContract]
和[DataMember]
属性添加到您的帐户类
[DataContract]
public class Accounts
{
[DataMember]
public string Name { get; set; }
[DataMember]
public int Qty { get; set; }
[DataMember]
public decimal Weight { get; set; }
[DataMember]
public decimal Value { get; set; }
}
此外,使用服务的客户端代码应配置为接收收集类型System.Collection.Generic.List
右键单击“服务引用”,然后选择“配置服务引用”。在Collection Type组合中,选择System.Collection.Generic.List而不是默认的Array
仅仅为了完整性,正如其他人已经说过的那样,拥有两个具有相同名称账号的类是没有用的。这只会使编译器混淆到接收错误的点。并且您已经创建了一个List变量,因此只返回该变量。
答案 1 :(得分:2)
您获得的错误(省略了相关部分)显示了问题:
我的Service1.GetAllAccounts()方法无法实现我的IService1.GetAllAccounts(),因为它没有匹配的返回类型'系统.....列表”。
您有两个Accounts
个类,一个在您的服务界面中,另一个在您的实现中。它们可能也在不同的名称空间中。所以你的界面包含一个方法:
List<Accounts(FromInterface)> GetAllAccounts();
你的实现有一个方法:
List<Accounts(FromImplementation)> GetAllAccounts()
这会导致您的错误,因为List<Accounts(FromInterface)>
不是List<Accounts(FromImplementation)>
。
在另一个文件中创建Accounts
类,并确保接口和实现引用相同的Accounts
类型。
答案 2 :(得分:1)
List<Accounts> Accs = new List<Accounts>();
Accs已经是List对象了,
return Accs.ToList();
应该是
return Accs;
答案 3 :(得分:1)
由于某种原因,服务返回的类型只能是数组(Accounts()
)
点击F12
(转到定义)功能service.GetAllAccounts();
,您会发现它返回Accounts()
,而不是List<Accounts>
。
只需致电service.GetAllAccounts().ToList;
即可解决您的问题。
此外,您无需重新声明Accounts
中的Service1.svc.cs
课程,因为它已经在界面IService.cs
中。
编辑:您可能也需要实施您的课程:
public List<Accounts> GetAllAccounts() : IService1 {
...
}