LINQ Вопрос - Запрос - PullRequest
       1

LINQ Вопрос - Запрос

1 голос
/ 03 августа 2010

У меня есть таблица, в которой хранятся культурные варианты, например, для конкретного ключа.

RecordID   Key    CultureID   Description
1          1      en-GB       Hour
2          1      es-ES       hora
3          2      en-GB       Swimming

У меня есть это как IEnumerable.следующий.Короче говоря, если культурный вариант существует, верните его для данного параметра, иначе верните запись "en-GB" (которая всегда существует).Может кто-нибудь помочь мне с запросом LINQ для этого.

RecordID   Key    CultureID   Description
2          1      es-ES       hora
3          2      en-GB       Swimming

Спасибо

Ответы [ 3 ]

2 голосов
/ 03 августа 2010

Вы можете использовать тот факт, что логические значения сортируются как [false, true], поэтому следующий запрос сначала отсортирует все совпадения не , равные en-GB, а затем en-GB.

var result = (from x in variants
              where x.CultureID == cultureID || x.CultureID == "en-GB"
              orderby x.CultureID == "en-GB"
              select x).First();

Этот запрос выдаст ошибку, если для данного ключа даже не существует записи "en-GB" (First требует хотя бы одну запись), но, как вы сказали, она всегда существует.Если вы не уверены, что это так, используйте FirstOrDefault.

Обратите внимание, что многие поставщики LINQ поддерживают эту идиому, ее нельзя использовать только для IEnumerable / Lists.Таким образом, вы можете даже объединить фильтр по ключу и культуре как часть запроса LINQ, так что вы можете позволить базе данных разобраться за вас, и вы не получите полный список переводов назад, только тот, который вам нужен:

var result = (from x in db.Translations
              where x.Key == someKey
                && (x.CultureID == cultureID || x.CultureID == "en-GB")
              orderby x.CultureID == "en-GB"
              select x).First();
1 голос
/ 03 августа 2010

Всегда есть другой путь.

Союз:

IEnumerable<Varriant> result = variants
    .Where(x=>x.CultureID   == CultureID)
    .Union(variants.Where(x=> x.CultureID   == "en-GB"))
.ToList();

Variant v = variants.FirstOrDefault();

Другой

IEnumerable<Varriant> result = (
     from x in variants
      where x.CultureID   == CultureID || x.CultureID   == "en-GB"
     select x


).ToList();

Varriant r = null;
if(result.Length <= 1){
   r = result.FirstOrDefault();

}else{
     r = result.First(x=>x.CultureID   !="en-GB");
}
0 голосов
/ 03 августа 2010

Я думаю, вам придется сделать два запроса.Один, чтобы попытаться получить значение для культурного варианта (используя SingleOrDefault ()), затем проверить, является ли возвращенное значение нулевым.Если это так, выполните тот же запрос с en-BG вместо запроса, заданного в качестве параметра.

var result = (from i in records where RecordID = 1 && CultureID = "es-ES" select i).SingleOrDefault();

if (result == null) result = = (from i in records where RecordID = 1 && CultureID = "es-ES" select i).Single();

Или, возможно, с помощью некоторого предложения orderby?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...