2016-06-05 3 views
0

У меня есть веб-приложение Azure, работающее в качестве успокоительного API. Этот задний конец определяет модели, используемые моей системой: пользователи, команды, проекты, элементы. Пользователь может присоединиться к многим командам, а команда -> Проект -> Структура элемента - это отношение «Бабушка и дедушка» -> «Родитель -> ребенок».Azure WebJobs и модели и SQL-запросы

Я хочу настроить ежедневный электронный дайджест обновлений для каждого пользователя. Я хочу, чтобы это выполнялось в веб-задаче Azure в фоновом режиме, чтобы не обременять клиента сервером API.

При написании кода в контроллерах АНИ, я могу писать простые запросы, как это, чтобы получить все элементы, которые принадлежат к определенной команде (поскольку модель и их иерархические отношения определены в API):

var items = await (from x in db.Items 
        where x.Project.Team.TeamId == teamId 
        select x).ToListAsync(); 

Однако в работе в Интернете я не могу этого сделать - нет моделей, о которых можно было бы говорить. Я вижу пару вариантов:

Вариант A) Как-то использовать (или воссоздавать) модели (и контекст БД?) В веб-задании. Если это возможно (и не ужасная идея), я думаю, что это то, чего я хочу.

Вариант B) Сделайте мир с множеством подробных SQL-запросов в веб-задании. Я могу запросить таблицу User для того, из каких команд они являются частью. Затем для каждой команды я могу запросить таблицу Project для набора проектов. Затем для каждого проекта я могу запросить таблицу Items для Items в каждом проекте.

Есть ли способ сделать магический SQL-запрос, который работает более эффективно, чем многие вызовы B в базе данных? Я пытался что-то вроде следующего, но не нашли рабочую схему:

SELECT * FROM Items WHERE Projects WHERE Teams = teamId; 
+0

SQL имеет '=' для равных. – jarlh

+0

@jarlh хорошая точка - отредактировано. Это, конечно, было не единственное, что было неправильно с моим составленным запросом :) – waffles

ответ

0

Ну, кажется, что я хотел было JOIN: What's the difference between INNER JOIN, LEFT JOIN, RIGHT JOIN and FULL JOIN?

Я действительно только когда-либо использовал LINQ для вытаскивать из базы данных SQL, теперь я знаю, как сделать это по старинке, более подробный, менее интуитивный способ :)

Вот код, который я использую, чтобы тянуть все элементы, которые принадлежат к той или иной группе:

SqlCommand command = new SqlCommand(); 
command.CommandText = @"SELECT Items.* FROM Items 
         JOIN Projects 
          ON Projects.ProjectId = Items.ProjectId 
         JOIN Teams 
          ON Teams.TeamId = Projects.TeamId 
        WHERE Teams.TeamId = '" + teamId.ToString() + "'"; 
1

Лучшим способом с моей точки зрения является Opition C) - реорганизовать ваше решение и создать отдельный проект, который будет содержать контекст данных, модели и все миграции. После этого вы можете ссылаться на этот проект из основного приложения и из WebJob. Вы также можете перенести некоторые основные функции, связанные с базой данных, в этот проект, чтобы сделать их доступными из других проектов.

+0

Это звучит довольно разумно - слишком многое изменить сейчас, но, возможно, скоро! – waffles