#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}