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.Emptynull没有错误时更有意义,但是如果你愿意,没有什么能阻止你进行检查。在所有:

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 回答