MVC 2, Entity Framework 4. Пользовательский универсальный запрос. Куда я положил код? - PullRequest
0 голосов
/ 20 августа 2010

Вот моя проблема, у меня есть многоязычная база данных Shema. Сначала я хочу запрос с этим результатом
Французский | Английский
Автомобиль | NULL
Этуаль | Звезды
NULL | Обезьяна
...

Я почти уверен, что мне нужно использовать левое объединение с сводной таблицей.
Где я полагаю, чтобы поставить этот запрос. В частичном классе или мне нужно использовать шаблон репозитория для хранения запроса.

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

Языки
LangID PK
LangName nvarchar (100)

Категория
CatID Pk
IsActive Bit

CategoryText
CatID FK
CatName nvarchar (200)
LangID Int

Ответы [ 2 ]

0 голосов
/ 21 августа 2010

Кажется, вы задаете несколько вопросов здесь.Во-первых, когда вы спрашиваете, куда поместить запрос, это действительно соответствует дизайну, которому вы следите.Шаблон хранилища кажется разумной идеей для доступа к данным во многих случаях, но я не знаю, подходит ли он в вашем случае.Вы уже используете репозитории где-нибудь, например?

Во-вторых, вы ищете рабочий, «общий» запрос (т. Е. Тот, который будет работать для любого количества языков) в SQL или через LINQ?

Если в LINQ, пожалуйста, взгляните на ответы на этот вопрос.Они могут быть применимы: Сводные данные с использованием LINQ

Если в SQL предполагается, что вы используете SQL Server, вы действительно можете выполнить сводку с помощью GROUP BY или, если вы используетеработает последняя версия, оператор PIVOT.Однако ни один из случаев не поддерживает динамическое количество языков - запрошенные столбцы для каждого должны быть объявлены явно.Например:

--GROUP BY
SELECT ct.CatID,
  MAX(CASE WHEN l.LangName = 'English' THEN ct.CatName END) AS English,
  MAX(CASE WHEN l.LangName = 'French' THEN ct.CatName END) AS French
FROM CategoryText ct INNER JOIN Languages l ON l.LangID = ct.LangID
GROUP BY ct.CatID;

--PIVOT
SELECT ct.CatID, English, French
FROM CategoryText ct INNER JOIN Languages l ON l.LangID = ct.LangID
  PIVOT(MAX(ct.CatName) FOR l.LangName
    IN([English], [French])) AS P;

Поскольку оператор Pivot не поддерживает динамический оператор, такой как подзапрос в аргументе расширения (IN (английский, французский)), я не уверен, как обрабатывать общий случай,Надеюсь, это, по крайней мере, прояснит ваше направление.

0 голосов
/ 21 августа 2010

Простой запрос, который выводит ваш результат (предположим, LangID1 = французский, LangID2 = английский):

SELECT ct1.CatName as french, ct2.CatName as english
FROM CategoryText ct1, CategoryText ct2
WHERE ct1.LangID = 1 AND ct2.LangID = 2
AND ct1.CatID = ct2.CatID

В каком сценарии вам нужна мультиязычная способность?Если вам нужны только 2 языка во время выполнения, я предлагаю вам запросить оба и создать Tuple (новый класс Tuple поставляется с .NET 4.0), где первый универсальный параметр - это lang id, а другие - конкретные языки.Вы можете создать частичный класс на вашем объекте CategoryName, который содержит функцию, которая предоставляет вам эти словарь / кортеж.Вы можете легко перевести вышеуказанный запрос в LINQ, например:

Jan

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