3

さて、ここで私の質問です。私は Salesforce API からの saveresult を使用しており、LINQ を学んでいます。ここで使用するのが最善ではないかもしれませんが、わかりませんが、これが私がやろうとしていることです。

ところで、これは saveresult[] クラスを定義に縮小したものです。

public partial class SaveResult {

    private Error[] errorsField;
    private string idField;
    private bool successField;

    [System.Xml.Serialization.XmlElementAttribute("errors")]
    public Error[] errors

    [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
    public string id

    public bool success 
}

そして、これが私がやろうとしていることです。エラーをチェックし、返された保存結果のいずれかにエラーがある場合はそれらを返し、エラーがない場合は null を返します。

string errors = null;
        foreach (SaveResult s in saved)
        {
            if (s.success) continue;
            else
            {
                foreach (Error e in s.errors)
                {
                    errors += String.Format("Errors on object: {0}. Error Code is: {1}. Error Message: {2}",
                                            s.id,e.statusCode.ToString(),e.message);
                }
            }
        }

これまでのところ、私は持っています:

return saved
   .Select(i => i.errors
      .Select(j => new { j.statusCode, j.message })
      .Distinct()
      .ToList()
      ).ToString();

先に進む前に、エラーの i を評価するために匿名関数が必要になると確信しています。

とにかく、それだけです。助けてくれてありがとう(または私を助けてくれるリンク!)

4

4 に答える 4

4

クエリ構文の使用:

return string.Join("",
    from s in saved
    where ! s.Success
    from e in s.Errors
    select string.Format(
        "Errors on object: {0}. Error Code is: {1}. Error Message: {2}",
        s.id, e.statusCode);

SelectManyこれは舞台裏に翻訳されています。

于 2012-08-30T16:32:18.140 に答える
3

私はあなたがこれを望んでいると思います:

errors =
    string.Join(Environment.NewLine, 
        saved.Where(x => !x.success)
             .SelectMany(x => x.errors
                               .Select(y => string.Format("Errors on object: {0}. "
                                                          + "Error Code is: {1}. "
                                                          + "Error Message: {2}",     
                                                          x.id,
                                                          y.statusCode.ToString(), 
                                                          y.message)));     
于 2012-08-30T16:28:27.747 に答える
2

通常、トラバースするオブジェクト グラフがある場合は、クエリ構文を使用します。これ:

from saveResult in saved
where !saveResult.success
from error in s.errors
select 
    string.Format("Errors on object: {0}. Error Code is: {1}. Error Message: {2}",
    s.id, e.statusCode.ToString(), e.message)

文字列のシーケンスを提供します。現在行っていることを実行するには、区切り記号としてJoin一緒に使用できますがstring.Empty、読みやすくするために空でない区切り記号が必要になる場合があります。

エラーがない場合string.Emptyよりも戻る方が理にかなっていると思いますが、必要に応じてそのチェックを行うことを止めるものは何もありません。null全部で:

var errors = 
    from saveResult in saved
    where !saveResult.success
    from error in s.errors
    select 
        string.Format("Errors on object: {0}. Error Code is: {1}. Error Message: {2}",
        s.id, e.statusCode.ToString(), e.message);

var aggregateErrors = string.Join(string.Empty, errors);

return string.IsNullOrEmpty(aggregateErrors)
    ? null
    : aggregateErrors;
于 2012-08-30T16:30:36.473 に答える
0
return string.Join(Environment.NewLine, saved
    .Where(save => !save.success)
    .SelectMany(save => save.errors
        .Select(err => Tuple.Create(save.id, err.statusCode, err.message)))
    .Select(i => string.Format("Errors on object: {0}. Error Code is: {1}. Error Message: {2}", 
        i.Item1, i.Item2, i.Item3)));
于 2012-08-30T16:27:26.410 に答える