Как я могу преобразовать Sql запрос сервера с помощью Outer Apply в Linq C#? - PullRequest
1 голос
/ 23 марта 2020

У меня есть таблица с результатами некоторых преобразований, и мне нужно объединить преобразованные значения со всеми фактическими значениями в моем бэкэнде, используя приблизительный фильтр.

Я мог бы сделать это с помощью запроса, подобного этому :

with values_to_search as (
    select 13 as quantity
    union
    select 21 as quantity
    union
    select 30 as quantity
)

select
    vts.quantity,
    converted.ConvertedQuantityMg
from values_to_search vts
OUTER APPLY (
    select top 1
        cd.ConvertedQuantityMg
    from MyConversion cd
    where
        cd.Quantity <= vts.quantity
    order by cd.Quantity desc
) as converted

SQL Fiddle

Объекты: values_to_search cte предназначен только для имитации данных, которые будут запрашиваться.

Единственное решение, которое я мог придумать, выполняя его в одном запросе, - это получить все данные в памяти, фильтруя по диапазону и получая точное преобразованное значение в памяти.

Что-то вроде :

var valuesToFilter = new List<int>() { 13, 21, 30 };

var results = _context.Set<MyConversion>()
    .Where(conversion => conversion.Quantity >= valuesToFilter.Min() &&
                         conversion.Quantity <= valuesToFilter.Max())
    .ToList();

foreach (var val in valuesToFilter )
{
   var convertedValue = results.Where(conversion => conversion.Quantity <= val)
                               .OrderByDescending(conversion => conversion.Quantity)
                               .FirstOrDefault();
}

Есть ли способ перевести указанный выше sql запрос в Linq? Я использую EF Core 2.6.

...