2013-03-11 85 views
1

我有一个方法,搜索具有相同公司名称的所有客户的数据库,然后返回他们的ID号列表,现在我将它们保存到文本文件,所以我可以确认它的工作。循环删除列表中的多个项目... c#

但是我遇到的问题是访问该ID号列表并返回并删除它们。在下面的代码中,我使用一个请求来取消客户的ID号。我使用了一个foreach循环,它应该得到ID列表并删除它们,但是每次只删除一个而不是另一个,它每次删除一个,而尝试去,我只是返回异常称您正尝试删除已被删除的客户。请发送任何关于我在做什么错误的建议!

SearchRequest _request; 
CancelRequest _request2; 

SearchResponse _response; 
CancelResponse _response2; 

public void ArrangeRequest() { 
    _request=new CustomerSearchRequest(); 
    _request.Company="Test Inc. "; 
} 
var customerIds=_response.Customers.Select(c => c.CustID).ToList(); 

foreach(var custID in customerIds) { 
    _request2=new CancelRequest(); 
    _request2.CustID=custID; 
    _request2.Company=_request.Company; 
} 
public void Response() { 
    var ws=new RunEngine(); 

    _response=ws.SearchCust(new AppHeader(), _request) as SearchResponse; 
    _response2=ws.CancelCust(new AppHeader(), _request2) as CancelResponse; 
} 
+0

cancelRequest执行删除操作。我不必手动编写代码。这是一个自动生成的对象。 – CSharpDev4Evr 2013-03-11 15:48:15

+0

@GrantThomas推测取消请求的集合通过其他方法发送到服务器。重点在于,OP不知道如何做的唯一的事情就是创建取消对象;他有能力使用他们实际上自己删除数据。 – Servy 2013-03-11 16:01:07

回答

0

_request似乎是一个孤独的变量,而不是一个列表。然后它只会创建一条记录,因为您每次都通过循环创建新记录,并且不会将任何以前的循环值存储在列表中。

编辑:你会想要做这样的事情:

var requestList = new List<CancelRequest>(); 
    var customerIds = _response.Customers.Select(c => c.CustID).ToList(); 
    foreach (var custID in customerIds) 
    { 
     _request = new CancelRequest(); 
     _request.CustID = custID; 
     _request.Company = _request.Company; 
     requestList.Add(_request); 
    } 
+0

感谢您的回复,但同样的问题仍在发生,仍然试图删除相同的ID号码。 – CSharpDev4Evr 2013-03-11 16:05:41

+0

增加了额外的代码给原文,希望能更好地解释它。现在我正在尝试一些额外的东西,看看我能否弄清楚,但任何建议都很棒!谢谢! – CSharpDev4Evr 2013-03-11 16:15:40

+0

只是在我调试的时候通过代码,我看到当我看到'_request2.CustID = custID'时,它已经为custID分配了相同的ID号码,但我想它不会将它更改为我们存储在名单。 – CSharpDev4Evr 2013-03-11 16:19:50

4

正在重用_request2场。

List<CancelRequest> _cancelRequests; 

然后创建和所有的请求添加到这个列表:不是存储在单场取消请求,请求使用清单

var customerIds = _response.Customers.Select(c => c.CustID); 
_cancelRequests = customerIds.Select(custID => new CancelRequest { 
          CustID = custID, 
          Company = _request.Company 
        }).ToList(); 

和处理这些请求一一之后。

+0

这是什么'_request.Company'? – IronMan84 2013-03-11 15:43:51

+0

@ IronMan84已经删除,思考... – 2013-03-11 15:44:10

+1

@ IronMan84这是什么OP使用。如果这不是它应该的,我们不知道该在哪里。 – Servy 2013-03-11 15:44:16

1

似乎您的问题不会直接发生在列表中,因为您的CancelCust一次只能取一个Request。我实际上不明白你发布的最早的代码片段应该在哪里,所以我只是把它命名为NowhereMethod

我也修改了你的代码,纠正了一些像_request.Company=_request.Company;。根据您发布的代码,我进一步从使用中推导出所有类的层次结构。

正如你所说,删除被CancelRequest完成的,但是,正如我上面提到的,就只能采取一个Request的时间,而Request推断,它保存的信息只有一个客户。因此,我认为你的问题可以通过重写Response方法来解决。

你仍然可以认为这个问题即将成为一个像其他答案一样的列表,那些是使用Linq的正确方法。尽管如此,您可能需要决定放置某个班级的正确位置,然后以正确的方式设计一个方法来列表。

所以,这是代码,我推断并试图纠正;请注意,我使用字段而不是那些可能是属性,只有那些是需要的。

您可能想看看代码中的注释。

partial class Listener /* I named it, to put your code */ { 
    SearchRequest _request; 
    CancelRequest _request2; 

    SearchResponse _response; 
    CancelResponse _response2; 

    public void ArrangeRequest() { 
     _request=new CustomerSearchRequest(); 
     _request.Company="Test Inc. "; 
    } 

    void NowhereMethod() { 
     var customerIds=_response.Customers.Select(c => c.CustID).ToList(); 

     foreach(var custID in customerIds) { 
      _request2=new CancelRequest(); 
      _request2.CustID=custID; 
      _request2.Company=_request.Company; 
     } 
    } 

    public void ResponseOriginal() { 
     var ws=new RunEngine(); 

     _response=ws.SearchCust(new AppHeader(), _request) as SearchResponse; 
     _response2=ws.CancelCust(new AppHeader(), _request2) as CancelResponse; 
    } 

    public void Response() /* tried to correct */ { 
     var ws=new RunEngine(); 

     _response=ws.SearchCust(new AppHeader(), _request) as SearchResponse; 

     var customerIds=_response.Customers.Select(c => c.CustID).ToList(); 

     foreach(var custID in customerIds) { 
      _request2=new CancelRequest(); 
      _request2.CustID=custID; 
      _request2.Company=_request.Company; 

      // Seems it should be like this 
      // but note the assignment might be wrong, it's according to what `CancelCust` returns 
      // for the correct way to make it a list of Customer is appeared in other answers 
      _response2=ws.CancelCust(new AppHeader(), _request2) as CancelResponse; 
     } 
    } 
} 

partial class Customer { 
    public String CustID; 
} 

partial class Response { 
    public List<Customer> Customers; 
} 

partial class Request { 
    public String Company; 
    public String CustID; 
} 

partial class SearchResponse: Response { 
} 

partial class CancelResponse: Response { 
} 

partial class SearchRequest: Request { 
} 

partial class CancelRequest: Request { 
} 

partial class CustomerSearchRequest: SearchRequest { 
} 

partial class AppHeader { 
} 

partial class RunEngine { 
    public Response SearchCust(AppHeader appHelper, Request request) { 
     // I don't know what it's like 
     throw new NotImplementedException(); 
    } 

    public Response CancelCust(AppHeader appHelper, Request request) { 
     // I don't know what it's like 
     throw new NotImplementedException(); 
    } 
} 

RequestCustomer可以被声明为

partial class Customer { 
    // Company was not appearing used in the code 
    public String CustID; 
} 

partial class Request { 
    public String Company; 
    public String CustID; 
} 

partial class Customer { 
    public String Company; 
    public String CustID; 
} 

partial class Request: Customer { 
} 

不会打破代码。