1

同じ会社名を持つすべての顧客をデータベースで検索し、ID 番号のリストを返すメソッドがあります。今のところ、それらをテキスト ファイルに保存して、それが機能していることを確認できるようにしています。

私が抱えている問題は、その ID 番号のリストにアクセスし、戻ってそれらを削除することです。次のコードでは、ID 番号で顧客をキャンセルするリクエストを使用しています。IDのリストを取得してそれらをすべて削除することになっていたforeachループを使用しますが、代わりに毎回異なるものではなく1つを削除し、毎回同じものを削除しようとしますが、例外を取得するだけですすでに削除された顧客を削除しようとしていると言っています。私が間違っていることについて何か提案を送ってください!

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;
}
4

3 に答える 3

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();

そして、後でそれらのリクエストを 1 つずつ処理します。

于 2013-03-11T15:42:38.157 に答える
1

CancelCust一度に1つずつ取ることができるため、リストでは問題が直接発生しないようRequestです。あなたが投稿した最初のコードフラグメントがどこにあるのか実際には理解できないので、名前を付けますNowhereMethod!

私もあなたのコードを修正し、のようなものを修正しました_request.Company=_request.Company;。あなたが投稿したコードに従って、使用法からすべてのクラス階層をさらに推測しました。

おっしゃるとおり、削除は さんによって行われますがCancelRequest、前述したように一度に 1 件しか削除できずRequest、さんRequestは 1 人の顧客に関する情報のみを保存していると推測されます。したがって、あなたの問題は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();
    }
}

RequestandCustomerは次のように宣言できます。

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 {
}

コードを壊しません。

于 2013-03-11T18:54:13.493 に答える
0

_requestリストではなく、単独の変数のようです。ループを介して毎回新しいレコードを作成し、以前のループ値をリストに保存しないため、1 つのレコードのみが実行されます。

編集:次のようなことをしたいでしょう:

    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);
    }
于 2013-03-11T15:42:02.460 に答える