me gustaría sugerir el uso de un patrón de filtro, donde escribes métodos de extensión contra IEnumerable. De esta manera la mayor parte de su lógica se encapsula en métodos que puede utilizar una y otra vez:
public static class TextExtensions
{
[System.Runtime.CompilerServices.Extension]
public static IEnumerable<Text> ByTextId(this IEnumerable<Text> qry, int textId)
{
return qry.Where(t => t.TextId == textId);
}
[System.Runtime.CompilerServices.Extension]
public static IEnumerable<Text> ByLanguage(this IEnumerable<Text> qry, string language)
{
return qry.Where(t => t.Language == language);
}
}
Su código se convierte entonces en:
var texts = MyDB.Texts.ByTextId(1).ByLanguage("Danish");
La repetición se convierte en un no-tema.También me sugieren hacer usted mismo una clase estática para mantener los diversos valores de idioma para evitar el disco-codificación:
public static class LanguageValues
{
public static string English
{
get
{
return "English";
}
}
public static string Danish
{
get
{
return "Danish";
}
}
}
Su código se convierte entonces en:
var texts = MyDB.Texts.ByTextId(1).ByLanguage(LanguageValues.Danish);
Esto se puede combinar con el método DefaultIfEmpty que le ofrece:
var texts = MyDB.Texts.DefaultIfEmpty(MyDB.Texts.ByTextId(1).ByLanguage(LanguageValues.English).Single()).ByTextId(1).ByLanguage(LanguageValues.Danish);
Puede acabar poniendo esto en un método de extensión única para su reutilización:
[System.Runtime.CompilerServices.Extension]
public static IEnumerable<Text> GetValueOrDefault(this IEnumerable<Text> qry, int textId, string language)
{
return qry.DefaultIfEmpty(qry.ByTextId(textId).ByLanguage(LanguageValues.English).Single()).ByTextId(textId).ByLanguage(language);
}
ahora se puede llamar simplemente:
var text = MyDB.Texts.GetValueOrDefault(1, LanguageValues.Danish);
Tenga en cuenta que esto puede ser usado como el paso final de cualquier consulta así que algo como esto también funcionaría:
var text = MyDB.Texts.Where(<some funky clause>).Where(<some other funky clause>).GetValueOrDefault(1,LanguageValues.Danish);
Como ya se ha señalado Si va a múltiples idiomas de copia de seguridad, hay mejores enfoques que consultar un idioma a la vez como en la pregunta original, pero este patrón de filtro funcionará limpiamente, es solo cuestión de definir los filtros correctos para su caso de uso y estrategia. .
Su bonito, pero podrías hacer una función que decida si tiene que ordenar el resultado ascendente o descendente por medio de x.Language, de modo que cuando hagas FirstOrDefault() tengas el idioma deseado si existe o el inglés (la consulta sería Donde (x.Language == "Danés" || x.Language == "Inglés")). – LueTm
Hacer un pedido es una mala idea: confía en la coincidencia de que el danés está antes que el alfabeto en inglés ... ¿Qué sucede si quieres ofrecer en danés, inglés y francés? – RichardW1001
Por eso dije "una función que decide si tiene que ordenar el resultado de forma ascendente o descendente". Realmente puede usar str.CompareTo – LueTm