Как вернуть подзапрос в LINQ/EF
У меня есть следующий метод, который возвращает подзапрос SQL. С возвращением метода я разрабатываю основной запрос.
Но теперь мне нужно сделать это с помощью запроса LINQ.
Как мне это сделать?
Public void AvailableStock()
{
string query = "Select prod.ID, prod.Name, ";
query += AvailableStockQuery("prod.ID") + " as AvailableStock ";
query += " From TAB_Products prod ";
}
Public string AvailableStockQuery(string ProductAlias = "prod.ID")
{
string query = "((Select Sum(est.Quantity) " +
" From ProductStock est " +
" Where est.ProductID = " + ProductAlias +
" ) " +
" - (Select Sum(it.Quantity) " +
" From OrderItens it " +
" Where it.ProductID = " + ProductAlias +
")" +
") ";
return query;
}
1 ответ
Но вам даже не нужен подзапрос здесь. Вы можете просто присоединить таблицы ProductStock и OrderItens к таблице TAB_Products и сгруппировать их по prod.ID, и тогда подзапросы вообще не нужны. Вероятно, производительность тоже лучше. И это легче перевести на EF, потому что нет никаких подзапросов.
Что-то вроде этого:
SELECT prod.ID, FIRST(prod.Name), (SUM(est.Quantity) - Sum(it.Quantity)) AS AvailableStock
From TAB_Products prod
LEFT JOIN ProductStock est ON est.ProductID = prod.ID
LEFT JOIN OrderItens it ON it.ProductID = prod.ID
GROUP BY prod.ID
Но, если вы хотите, вы также можете создавать подзапросы, вот пример: https://docs.microsoft.com/en-us/dotnet/csharp/linq/perform-a-subquery-on-a-grouping-operation