Te sugerimos que revises esta solución en un entorno controlado antes de enviarlo a producción, un saludo.
Solución:
Según tengo entendido, en Linq el método FirstOrDefault() puede devolver un valor predeterminado de algo que no sea null.
No. O más bien, es siempre devuelve el valor predeterminado para el tipo de elemento… que es un null referencia, la null valor de un tipo de valor que admite valores NULL, o el valor natural “todo ceros” para un tipo de valor que no acepta valores NULL.
¿Hay alguna forma particular de configurar esto para que, si no hay ningún valor para una consulta en particular, se devuelva algún valor predefinido como valor predeterminado?
Para los tipos de referencia, solo puede usar:
var result = query.FirstOrDefault() ?? otherDefaultValue;
Por supuesto que esto además darle el “otro valor predeterminado” si el primer valor está presente, pero es un null referencia…
Puede usar DefaultIfEmpty seguido de First:
T customDefault = ...;
IEnumerable mySequence = ...;
mySequence.DefaultIfEmpty(customDefault).First();
Caso general, no solo para tipos de valor:
static class ExtensionsThatWillAppearOnEverything
public static T IfDefaultGiveMe(this T value, T alternate)
if (value.Equals(default(T))) return alternate;
return value;
var result = query.FirstOrDefault().IfDefaultGiveMe(otherDefaultValue);
Nuevamente, esto realmente no puede decir si hay era cualquier cosa en su secuencia, o si el primer valor era el predeterminado.
Si te importa esto, podrías hacer algo como
static class ExtensionsThatWillAppearOnIEnumerables
public static T FirstOr(this IEnumerable source, T alternate)
foreach(T t in source)
return t;
return alternate;
y usar como
var result = query.FirstOr(otherDefaultValue);
aunque, como señala Mr. Steak, esto se podría hacer igual de bien .DefaultIfEmpty(...).First()
.