Проблема Entity Framework с объединением двух объектов

#c# #entity-framework #entity-framework-6

#c# #entity-framework #entity-framework-6

Вопрос:

У меня есть следующие объекты:

 public class City
    {
        public int CityId { get; set; }
        public string Name { get; set; }
        public virtual ICollection<CityTranslation> CityTranslations { get; set; }
    }
public class CityTranslation
    {
        public int CityId { get; set; }
        public string LanguageCode { get; set; }
        public string Translation { get; set; }

        public virtual City City { get; set; }
    }
  

Таблица City содержит значение языка по умолчанию в поле Name, другие переводы находятся в таблице CityTranslation.
У меня возникла проблема с получением значения по языку из этого.
Я пытаюсь выполнить следующее:

 public virtual IEnumerable<City> GetAllByLanguage(string language)
        {
            if (language != "en")
            {
                var data = from c in context.Cities
                           join t in context.CityTranslations
                           on c.CityId equals t.CityId
                           amp;amp; t.LanguageCode == language
                           select c;
            }
            else 
            {
                return dbSet.ToList();
            }
        }
  

Но я получаю ошибку компиляции.

Оператор ‘amp;amp;’ не может быть применен к операндам типа ‘int’ и ‘bool’

плюс некоторые ошибки приведения.
Что я должен сделать, чтобы получить значение из таблицы перевода?

Комментарии:

1. t.CityId является int , t.LanguageCode == language возвращает boolean . И amp;amp; является логическим И оператором. Вы не можете использовать его с int и bool .

2. Вы не имеете в виду where t.LanguageCode == language ? Вы также можете включить WHERE предложение в синтаксис lambda в ссылку на таблицу, к которой вы присоединяетесь, например join t in context.CityTranslations.Where(x => x.LanguageCode == language) on c.CityId equals t.CityId

3. var data = from c in context.Cities join t in context.CityTranslations.Where(x => x.LanguageCode == language) on c.CityId equals t.CityId select c; но я получаю ошибку приведения.

Ответ №1:

Другие заметили проблему, но вам даже не понадобится объединение — EF справится с этим:

 var data = from t in context.CityTranslations
           where t.LanguageCode == language
           select t.City;      
  

Комментарии:

1. На самом деле, я думаю, что этот ответ лучше!

2. Это не возвращает хороший перевод. Он по-прежнему возвращает City с переводом из таблицы city. Ваш ответ возвращает его из таблицы перевода.

3. В таблице перевода нет ‘City’. Оба метода достигают одного и того же результата (и, вероятно, выполняют один и тот же SQL) — вы выполняете объединение и возвращаете часть ‘City’. Ни один из них не даст вам перевода, если вы не включите t.Translation в какой-либо результат.

4. @CharlesMager Я должен повторно открыть этот вопрос, поскольку я принял ответ слишком быстро. Результирующий город из этого запроса по-прежнему возвращает мне объект City с языком по умолчанию. Можете ли вы помочь мне получить переведенный объект?

5. @ 1110 Нет City объекта с переведенным именем — что вы на самом деле хотите вернуть? Похоже, вам просто нужны все, CityTranslations которые соответствуют LanguageCode , что является гораздо более простым запросом (это, как я написал, но select t вместо select t.City .

Ответ №2:

Второй предикат не должен быть частью объединения:

 var data = from c in context.Cities
           join t in context.CityTranslations
               on c.CityId equals t.CityId
           where t.LanguageCode == language
  

Ответ №3:

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

 on new {t.CityId, t.languageCode} equals new {c.CityId, language}