Saltar al contenido

Método de extensión LINQ SelectMany y Where que ignora los valores nulos

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *