我有一个包含本地化值的表
LocalizedFruits
ID | LOCALE | NAME
1 | en_UK | Banana
2 | da_DK | Banan
3 | de_DE | Banane
4 | zh-CHS | 香蕉
然后我想自动填写用户输入的值,如果用户是中文,那就好了,但如果是来自其他文化之一的人出现问题,当他们输入“ba”时,用户将获得3个结果是一回事。 因此我按结果分组结果。
我想要做的是我想让该组具有与用户相同的语言环境,但由于用户可能使用的语言不同于其浏览器语言环境,因此语言环境可能不会产生任何结果,因此我想让组中的第一个项目满足区域设置条件,或者如果没有找到这样的项目只是组的第一个项目
List<LocalizedFruits> lf = db.LocalizedFruits.Where(p => p.Name.StartsWith(name))
.GroupBy(g => g.Locale)
.Select(g.First(l => l.Locale == locale) || g.First())
.ToList();
查询的最后一部分是错误的,因为它不可能放置“或”那里
任何Linq和Entity Framework Guru都知道如何构建一个查询吗?
答案 0 :(得分:1)
这实际上是一个排序问题。如果您使用的是Linq,我建议在从db加载数据后对其进行排序,然后根据您的标准对数据进行排序。
List<LocalizedFruits> lf = db.LocalizedFruits.Where(p => p.Name.StartsWith(name))
.GroupBy(g => g.Locale)
.ToList();
lf = lf.MakeFirst(m=> m.Locale == locale).ToList();
MakeFirst Extension:
public static class Ext
{
public static IEnumerable<T> MakeFirst<T>(this IEnumerable<T> items, Func<T, bool> predicate)
{
return items.OrderBy(m => predicate(m) ? 0 : 1);
}
public static void Test()
{
var givenLocale = 1;
var items = Enumerable.Range(0, 0).Select(m => new { Id = m, Locale = m });
var sorted = items.MakeFirst(m => m.Locale == givenLocale).ToList();
}
}
答案 1 :(得分:0)
您可以使用合并(??
)运算符代替or
.Select(g => g.FirstOrDefault(l => l.Locale == locale) ?? g.First())
或
.Select(g => g.OrderByDescending(m => m.Locale == locale).First())