Obtenir le premier élément correspondant ou Premier s'il n'y a pas de correspondance?

c# dapper linq sql-server

Question

Est-ce que c'est possible dans LINQ d'écrire un joli one-liner pour obtenir un premier élément correspondant ou s'il n'y a pas de correspondance que d'obtenir le premier élément de la collection?

Par exemple, vous avez une collection de perroquets et vous voulez un perroquet jaune mais s'il n'y a pas de perroquets jaunes - alors tout le monde le fera, quelque chose comme ceci:

Parrots.MatchedOrFirst(x => x.Yellow == true)

J'essaie d'éviter le double-aller à SQL Server et l'ORM que nous utilisons dans ce cas particulier est Dapper .

Réponse acceptée

Edit: C'était une solution linq to SQL

Construire d'abord une extension pratique

public static T MatchedOrFirstOrDefault<T>(this IQueryable<T> collection, System.Linq.Expressions.Expression<Func<T, Boolean>> predicate)
{
  return (from item in collection.Where(predicate) select item)
                    .Concat((from item in collection select item).Take(1))
                    .ToList() // Convert to query result
                    .FirstOrDefault();
}

En utilisant le code

var matchedOrFirst = Parrots.MatchedOrFirstOrDefault(x => x.Yellow);

Réponse populaire

Qu'en est-il de:

var matchedOrFirst = Parrots.FirstOrDefault(x => x.Yellow == true) 
    ?? Parrots.FirstOrDefault();

modifier

Pour les structures, cela devrait fonctionner:

var matchedOrFirst = Parrots.Any(x => x.Yellow == true) 
    ? Parrots.First(x => x.Yellow == true)
    : Parrots.FirstOrDefault();


Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi