实体框架选择满足条件或仅第一项的组中的第一项

时间:2013-12-09 03:35:36

标签: c# linq entity-framework

我有一个包含本地化值的表

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都知道如何构建一个查询吗?

2 个答案:

答案 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())