2013-12-09 5 views
1

У меня есть таблица с локализованными значениями, как этотEntity рамка Выберите первый элемент в группе, которая удовлетворяет условие, или только первый элемент

LocalizedFruits 
ID | LOCALE | NAME 
1 | en_UK | Banana 
2 | da_DK | Banan 
3 | de_DE | Banane 
4 | zh-CHS | 香蕉 

Тогда я хочу автозаполнение значения, которое пользователь вводит, если пользователь является китайским это все хорошо, но если это люди из одной из других культур, возникает проблема, когда они набирают «ba», пользователь получит три результата, которые являются одним и тем же. поэтому я группирую результат по Locale.

Что я хочу сделать, так это то, что я хочу, чтобы группа была с той же локалью, что и пользователь, но поскольку пользователь может печатать на другом языке, кроме своего локали браузера, существует вероятность того, что локаль не приведет к каким-либо результатам , для этого я хотел бы иметь первый элемент в группе, которая удовлетворяет условию локали или если такой элемент не найден только первый элемент группы

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 Гуру там, кто знает, как построить запрос, который делает это?

ответ

0

вы можете просто изменить Выбор за счет, используя COALESCE (??) оператор вместо or

.Select(g => g.FirstOrDefault(l => l.Locale == locale) ?? g.First()) 

или

.Select(g => g.OrderByDescending(m => m.Locale == locale).First()) 
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 Расширение:

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(); 
    } 
} 
+0

+1 Order By также может принять пользовательское выражение, однако вам это не нужно? O: 1, так как order By также может принимать логические значения. –

+0

Я полностью согласен с вами. Я просто хотел прояснить ситуацию - обычно порядок по-булевы дает ложный результат сверху ... – Rex

+0

О да, я забыл сказать вам использовать OrderByDescending –

Смежные вопросы