Первый?Не замужем?Или по умолчанию? - PullRequest
5 голосов
/ 06 сентября 2011

Я искал StackOverflow, но все еще не могу понять правильный синтаксис для использования запросов Single, First (или по умолчанию).

Я хочу сделать запрос, чтобы сначала перехватить перевод на конкретном языке. Если на БД такого перевода нет, получите первый на английском языке.

Вот что я получил до сих пор:

locale = "ja-jp";

var items = from c in db.Contents.Include("Translation")
            where c.RegionalInfo.Any(x => x.RegionId == locale)
            select c;

Редактировать Obs .: items is IEnumerable

Ответы [ 5 ]

4 голосов
/ 06 сентября 2011

Попробуйте что-то вроде этого.

var item = (from c in db.Contents.Include("Translation")
        where c.RegionalInfo.Any(x => x.RegionId == locale)
        select c).FirstOrDefault();
if (item != null)
   ...
3 голосов
/ 06 сентября 2011

Хотя такие операции, как Select, Where и т. Д., Можно преобразовать в синтаксис запроса, многие методы расширения не могут этого сделать.В этом случае операции First, Last, Single (+ XXXOrDefault) могут быть выполнены с использованием любого перечислимого, но не с синтаксисом запроса.

Поскольку компилятор достаточно умен, чтобы перевести запросв связанный результат IEnumerable<T> или IQueryable<t>, вы можете просто заключить запрос в скобки и затем вызвать методы:

var item = (from c in dbo.Contents.Include("Translation")
            where c.RegionInfo.Any(x => x.RegionId == locale)
            select c).FirstOrDefault();

... и т. д.

1 голос
/ 06 сентября 2011

Из вашего объяснения звучит так, как будто вы хотите получить значение, если оно найдено, и если не найдено, использовать английский перевод. Учтите следующее:

locale = "ja-jp"; 

var itens = from c in db.Contents.Include("Translation") 
            where c.RegionalInfo.Any(x => x.RegionId == locale) ||
                  c.RegionalInfo.Any(x => x.RegionId == "en")
            order by (c.RegionalInfo.RegionId == "en", "zzzz", c.RegionalInfo.RegionId) 
            select c; 
var foundItem = items.FirstOrDefault();
if (foundItem != null)
{ ... }

Это находит reocrds, которые соответствуют вашей локали и английской, а затем сортирует результаты по regionId, помещая найденный английский элемент в конец списка, а затем берет первую запись (если найдена). Примечание: я не тестировал эту реализацию, поэтому обязательно проверьте параметр orderby, чтобы убедиться, что он работает как задумано.

1 голос
/ 06 сентября 2011

Или, если вы предпочитаете "non-Linq" синтаксис метода, вы можете сделать что-то вроде этого:

0 голосов
/ 06 сентября 2011

Используйте расширение DefaultIfEmpty, чтобы установить значение по умолчанию для пустой последовательности.

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