Esta es el arreglo más correcta que encomtrarás compartir, pero primero mírala pausadamente y valora si es compatible a tu trabajo.
Solución:
survey.QuestionList
.Where(l => l.Questions != null)
.SelectMany(l => l.Questions)
.Where(q => q != null && q.AnswerRows != null)
.SelectMany(q => q.AnswerRows);
Le recomiendo que se asegure de que sus colecciones nunca se null
. null
puede ser un poco molesto si no lo manejas bien. terminas con if (something != null)
en todo su código. Luego usa:
survey.QuestionList
.SelectMany(l => l.Questions)
.SelectMany(q => q.AnswerRows);
public static IEnumerable SelectNotNull(
this IEnumerable source, Func> selector)
where TResult : class
return source.Select(selector)
.Where(sequence => sequence != null)
.SelectMany(x => x)
.Where(item => item != null);
Esto le permite hacer lo siguiente:
var allAnswers = survey.QuestionList
.SelectNotNull(list => list.Questions)
.SelectNotNull(question => question.AnswerRows);
Una solución que cumple con DRY sería usar el null-operador coalescente ??
en tus SelectMany
expresión lambda.
IEnumerable questions = survey.QuestionList.SelectMany(q => q.Questions ?? Enumerable.Empty());
IEnumerable answerRows = questions.SelectMany(q => q.AnswerRows ?? Enumerable.Empty());
Tanto en el código OP como en el código anterior, questions
y answerRows
nunca sera nullentonces el null no se requieren cheques (es posible que desee poner .Any()
cheques dependiendo de su lógica de negocios). Pero el código anterior tampoco resultará en una excepción si q.Questions
o q.AnswerRows
es null.
Puntuaciones y comentarios
Eres capaz de ayudar nuestro estudio exponiendo un comentario y puntuándolo te damos las gracias.