gpt4 book ai didi

c# - LINQ - 如果它们存在则选择它们,否则回退到这些

转载 作者:太空狗 更新时间:2023-10-29 18:20:55 24 4
gpt4 key购买 nike

想想本地化的文本,存储在这个表中:

表格文本

  • 文本编号
  • 语言
  • 值(value)

现在我想为 TextId 1 选择文本。如果“丹麦语”中没有此 TextId 的文本,我想回退到“英语”。

我可以这样做:

var texts = MyDb.Texts.Where(x=>x.TextId == 1 & x.Language == "Danish");

if (!texts.Any()){
texts = MyDb.Texts.Where(x=>x.TextId == 1 & x.Language == "English");
}

...但是我必须重复 Where 子句的其余部分,这意味着我在重复自己(在这个例子中还不错,但可能有更多的子句)。

有没有更简单的方法来做到这一点?

最佳答案

我建议使用过滤器模式,您可以在其中编写针对 IEnumerable 的扩展方法。这样,您的大部分逻辑都被封装到您可以一次又一次使用的方法中:

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);
}
}

您的代码将变为:

var texts = MyDB.Texts.ByTextId(1).ByLanguage("Danish");

然后重复就不是问题了。我还建议让自己成为一个静态类来保存各种语言值以避免硬编码:

public static class LanguageValues
{
public static string English
{
get
{
return "English";
}
}

public static string Danish
{
get
{
return "Danish";
}
}
}

您的代码将变为:

var texts = MyDB.Texts.ByTextId(1).ByLanguage(LanguageValues.Danish);

您可以将其与 DefaultIfEmpty 方法结合使用,该方法为您提供:

var texts = MyDB.Texts.DefaultIfEmpty(MyDB.Texts.ByTextId(1).ByLanguage(LanguageValues.English).Single()).ByTextId(1).ByLanguage(LanguageValues.Danish);

然后将其放入一个单独的扩展方法中以供重用:

[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);
}

您现在可以简单地调用:

var text = MyDB.Texts.GetValueOrDefault(1, LanguageValues.Danish);

请注意,这可以用作任何查询的最后一步,因此这样的事情也可以工作:

var text = MyDB.Texts.Where(<some funky clause>).Where(<some other funky clause>).GetValueOrDefault(1,LanguageValues.Danish);

正如人们指出的那样,如果您使用多种备份语言,有比在原始问题中一次检查一种语言更好的方法,但是这种过滤器模式将干净利落地工作,这只是定义正确的问题适用于您的用例和策略的过滤器。

关于c# - LINQ - 如果它们存在则选择它们,否则回退到这些,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5842887/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com