Как построить сложную функцию OData-v4 в C# / ASP.NET Сердечник

#c# #asp.net-core #odata

Вопрос:

У меня есть контроллер OData со следующей функцией:

 [ODataAttributeRoutingAttribute]  [EnableQuery(PageSize = 10)]  [HttpGet]  public virtual IActionResult Get()  {  var data = _dbContext.MyTable;  return Ok(data);  }  

Когда я выполняю вызов odata с фильтрами, инструкциями по порядку и т. Д., Я вижу, что фильтры применяются к сгенерированному SQL.

Теперь у меня есть более сложный запрос, который нужно написать. Я унаследовал плохой дизайн базы данных и не могу его изменить.

В этом проекте одна и та же структура таблиц существует в нескольких базах данных. Итак, DB1, DB2 .. DB(n) все содержат таблицу транзакций. В основном каждая база данных представляет данные за месяцы, причем DB1-это текущий месяц, а DB2-предыдущий месяц и так далее…

Мне нужно сделать запрос к базе данных, который вернет все транзакции для данного клиента за последние x месяцев. (x должен быть указан в качестве параметра).

Поскольку таблицы находятся в разных базах данных, у меня есть несколько DbContexts, введенных в мой контроллер. Итак, я подумывал о том, чтобы сделать что-то вроде этого:

 IEnumerablelt;Transactionsgt; m1 = null;   IEnumerablelt;Transactionsgt; m2 = null;   IEnumerablelt;Transactionsgt; m3 = null;     if ( pMonthsBack gt;=1 ) m1 = dbContext1.Transactions.Where( t =gt; t.Customer = pCustomerId);  if ( pMonthsBack gt;=2 ) m1 = dbContext2.Transactions.Where( t =gt; t.Customer = pCustomerId);  if ( pMonthsBack gt;=3 ) m1 = dbContext3.Transactions.Where( t =gt; t.Customer = pCustomerId);      return m1.Union(m2).Union(m3);   

Вопрос в том, как мне создать функцию, подобную описанной выше, в OData? И конкретно — могу ли я построить его так, чтобы все обычные функции Odata все еще работали ? Например, пейджинг, топ и т. Д.

Похоже, что «неограниченные функции» делают что-то подобное? На правильном ли я пути с ними?