Я согласен с ответом Шираз, что это не должно быть тем, что вы хотите, если вы все еще способны изменить дизайн, но я буду предполагать, что это существующее приложение, которое вы конвертируете в Entity Framework.
Если это так, имеет значение, отображаются ли столбцы Title_enGB / etc в файле EDMX / POCO. Если они есть, я полагаю, это возможно. Что вы можете сделать здесь, это использовать посетитель Expression, который посещает MemberExpressions, проверяет, имеют ли они доступ к свойству с именем «Title» (вы можете создать белый список свойств, которые должны обрабатываться подобным образом), а затем возвращать новое MemberExpression, которое вместо доступа обращается к Title_enGB, если вошедший в систему пользователь установил этот язык.
Быстрый пример:
public class MemberVisitor : ExpressionVisitor
{
protected override Expression VisitMember(MemberExpression node)
{
if(node.Member.Name == "Title")
{
return Expression.Property(node.Expression, "Title_" + User.LanguageCode)
}
return base.VisitMember(node);
}
}
А потом, прежде чем выполнить запрос:
var visitor = new MemberVisitor();
visitor.Visit(query);
Опять же, это хорошая идея, если у вас больше нет контроля над базой данных.
Это решение может быть или не быть практичным для вас, в зависимости от вашей конкретной ситуации, но переписывание запросов с использованием выражений определенно возможно.
Это решение гораздо более высокого уровня, чем изменение того, как Entity Framework генерирует фактические запросы SQL. Это действительно скрыто от вас, вероятно, по уважительной причине. Вместо этого вы просто изменяете дерево выражений, которое описывает запрос, и позволяете Entity Framework беспокоиться о преобразовании его в SQL.