Редактор тем android studio 3.3 ничего не показывает

Следующее правило состоит в том, чтобы избежать Where и предикатной версии Count в GroupBy результате и, если это возможно, использовать условный Sum. EF6 удалось перевести такие конструкции, но с очень неэффективным SQL.

Итак, в общем случае вам нужно переписать запрос следующим образом:

data
    .GroupBy(i => new { i.Status, i.InvoiceType })
    .Select(g => new
    {
        g.Key,
        Count = g.Count(),
        TotalLessThan100 = g.Sum(i => i.InvoicePayments < 100 ? i.EligibleValue : 0),
        TotalLessThan500 = g.Sum(i => i.InvoicePayments < 500 ? i.EligibleValue : 0)
    });

Однако EF Core 2.1 GroupBy улучшения перевода не включают Sum с другим, чем простой селектор свойств, поэтому вышеупомянутое все еще использует оценку клиента. Скорее всего, он будет исправлен в какой-то будущей версии, но до тех пор может использовать следующий трюк: добавить промежуточную проекцию (Select) до GroupBy, содержащую все поля, необходимые позже, включая рассчитанные, а затем использовать их внутри агрегаты после GroupBy:

data
    .Select(i => new
    {
        i.Status,
        i.InvoiceType,
        LessThan100 = i.InvoicePayments < 100 ? i.EligibleValue : 0,
        LessThan500 = i.InvoicePayments < 500 ? i.EligibleValue : 0,
    })
    .GroupBy(i => new { i.Status, i.InvoiceType })
    .Select(g => new
    {
        g.Key,
        Count = g.Count(),
        TotalLessThan100 = g.Sum(i => i.LessThan100),
        TotalLessThan500 = g.Sum(i => i.LessThan500)
    });

, который переводится на:

SELECT [i].[Status], [i].[InvoiceType], COUNT(*) AS [Count], SUM(CASE
    WHEN [i].[InvoicePayments] < 100.0
    THEN [i].[EligibleValue] ELSE 0.0
END) AS [TotalLessThan100], SUM(CASE
    WHEN [i].[InvoicePayments] < 500.0
    THEN [i].[EligibleValue] ELSE 0.0
END) AS [TotalLessThan500]
FROM [Invoice] AS [i]
GROUP BY [i].[Status], [i].[InvoiceType]
2
задан Gleb A. 19 January 2019 в 18:24
поделиться