Linq具有嵌入式功能

时间:2012-08-30 16:21:19

标签: c# .net linq salesforce linq-to-objects

好的,这是我的问题。我正在使用Salesforce API中的saveresult,我正在学习LINQ。这可能不是在这里使用的最好的东西,我不知道,但这是我正在努力做的事情,更加雄辩。

BTW,这是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();

我很确定在我继续之前我需要一个匿名函数来评估我的错误。

无论如何,就是这样。感谢您的帮助(或指向我帮助的链接!)

4 个答案:

答案 0 :(得分: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

答案 1 :(得分: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)));     

答案 2 :(得分: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;

答案 3 :(得分: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)));