创建服务以返回列表

时间:2013-08-07 11:57:09

标签: c# wcf

在我的 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#还不熟悉,有人可以提出建议吗?

4 个答案:

答案 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 {
    ...
}