Linq OrderBy rompt avec la propriété null de la propriété navigation

entity-framework linq-to-entities nullable sql-order-by

Question

Travailler avec quatre tables.

Utilisateurs -> a des informations utilisateur de base, y compris un ID utilisateur et un département (int)
Groupes -> informations de groupe de base incluant un groupid
GroupsMembers -> table qui a la relation entre un groupe et ses membres, une relation plusieurs à plusieurs, de sorte que groupid et userid sont les colonnes
Départements -> information de base sur le département incluant le deptid

J'ai un fk du departmentid dans la table users à l'id de deparmtnet dans la table des départements.

FK de groupes groupid à groupsmembers groupid FK de utilisateurs userid à groupmembers userid

Cela permet aux groupes dans edmx d'avoir une propriété de navigation des utilisateurs qui aura tous les membres du groupe.

var grp = grpSource.FirstOrDefault(g => g.GroupID == groupID)
if (grp.GroupID > 0)
{
    var userQuery = from u in grp.Users
                    where !u.Deleted
                    select u;
    userQuery = userQuery.OrderBy(u => u.Department.Name);
}

Je suis notamment Users.Department.

Le problème vient du fait que les utilisateurs n'ont pas nécessairement besoin d'un département. La colonne departmentid est donc nullable. S'il existe des utilisateurs pour lesquels l'ID de département a la valeur null, orderby se brise et indique que u.Department est null. Si aucun département n'est nul, cela fonctionne très bien. J'ai besoin d'un moyen de trier basé sur Department.Name même s'il existe des département département null. Aucune suggestion?

Réponse acceptée

Vous pouvez utiliser l'opérateur conditionnel pour vérifier si le département est null:

userQuery = userQuery.OrderBy(u => (u.Department != null) ? u.Department.Name : String.Empty);

Pour plus de clarté, j'ai créé la méthode d'extension suivante:

    public static TResult IfNotNull<TSource, TResult>(this TSource obj, Func<TSource, TResult> selector, TResult defaultValue)
    {
        if (obj != null)
            return selector(obj);
        return defaultValue;
    }

Il peut être utilisé comme suit:

userQuery = userQuery.OrderBy(u => u.Department.IfNotNull(d => d.Name, String.Empty));

Réponse populaire

Que diriez-vous d'utiliser l'opérateur de coalesce?

userQuery = userQuery.OrderBy(u => u.Department.Name ?? string.Empty);


Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow