Группа методов синтаксиса Linq по и подзапросу - PullRequest
0 голосов
/ 26 мая 2020

Возможен ли этот запрос с помощью linq?

    SELECT 
    SUM([Weight]) * (SELECT TOP 1 Value FROM dbo.Prices WHERE '2020-04-02' BETWEEN [From] AND [To] AND ScrapId = CS.ScrapId), [FromCompany] ,CS.[ScrapId]
    FROM [dbo].[CollectedScrap] AS CS
    WHERE Date BETWEEN '2020-05-01' AND '2020-05-29' GROUP BY[ScrapId], [FromCompany]

Последний тест:

content.table.Where(cs => cs.Date > from)
                .Where(cs => cs.Date < to)
                .GroupBy(collectedGroup => new { collectedGroup.ScrapId, collectedGroup.FromCompany})
                .Select(group => new
                {
                    total = group.Sum(c => c.Weight) * _context.Prices.Select(p => new { p.ScrapId, p.Value, p.From, p.To })
                                                                .Where(a => a.From > from)
                                                                .Where(a => a.To < to)
                                                                .Where(a => a.ScrapId == group.Select(gr => new { gr.ScrapId }).First().ScrapId)
                                                                .FirstOrDefault()

                }).ToList();

Между таблицами нет прямой связи. Я использую подзапрос, чтобы получить правильную цену по дате и умножить ее на суммарный результат группы по запросу.

1 Ответ

0 голосов
/ 26 мая 2020
content.table.Join(
                        _context.Prices,
                        collectedScrap => collectedScrap.ScrapId,
                        price => price.ScrapId,
                        (collectedScrap, price) => new
                        {
                            label = collectedScrap.Scrap.Label,
                            date = collectedScrap.Date,
                            price = price.Value,
                            scrap = collectedScrap.Scrap.Label,
                            weight = collectedScrap.Weight
                        }
                    )
                    .Where(d => d.date > from)
                    .Where(d => d.date < to)                    
                    .Select(result => new
                    {
                        scrap = result.label,
                        weight = result.weight,
                        price = result.price,
                        total = result.price * result.weight
                    }).ToList();

С обычным SQL я могу использовать условие для соединения. Как я могу использовать WHERE внутри соединения. Теперь он ведет себя почти как правое соединение (мне нужно ограничить соединение одним результатом). ----- тестирование с групповым объединением сейчас

сгенерировано sql:

SELECT [collectedScrap.Scrap].[Label] AS [scrap], [collectedScrap].[Weight], [price].[Value] AS [price], [price].[Value] * [collectedScrap].[Weight] AS [total]
FROM [CollectedScrap] AS [collectedScrap]
LEFT JOIN [Scrap] AS [collectedScrap.Scrap] ON [collectedScrap].[ScrapId] = [collectedScrap.Scrap].[ID]
INNER JOIN [Prices] AS [price] ON [collectedScrap].[ScrapId] = [price].[ScrapId]
WHERE ([collectedScrap].[Date] > @__from_0) AND ([collectedScrap].[Date] < @__to_1)
...