У меня есть таблица с результатами некоторых преобразований, и мне нужно объединить преобразованные значения со всеми фактическими значениями в моем бэкэнде, используя приблизительный фильтр.
Я мог бы сделать это с помощью запроса, подобного этому :
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.