Chcę przekonwertować następujące zapytanie na składnię LINQ. Mam wielki problem z zarządzaniem, aby to zadziałało. Próbowałem już zacząć od LINQ, ale odkryłem, że mogę mieć więcej szczęścia, jeśli napisałem to na odwrót.LINQ do SQL: Skomplikowane zapytanie z danymi zbiorczymi dla raportu z wielu tabel dla systemu zamówień
SELECT
pmt.guid,
pmt.sku,
pmt.name,
opt.color,
opt.size,
SUM(opt.qty) AS qtySold,
SUM(opt.qty * opt.itemprice) AS totalSales,
COUNT(omt.guid) AS betweenOrders
FROM
products_mainTable pmt
LEFT OUTER JOIN
orders_productsTable opt ON opt.products_mainTableGUID = pmt.guid
LEFT OUTER JOIN orders_mainTable omt ON omt.guid = opt.orders_mainTableGUID AND
(omt.flags & 1) = 1
GROUP BY
pmt.sku, opt.color, opt.size, pmt.guid, pmt.name
ORDER BY
pmt.sku
Końcowym wynikiem jest tabela, która pokazuje mi informacje o produkcie, jak widać powyżej. Jak napisać to zapytanie w formularzu LINQ, używając składni ze zrozumieniem?
Dodatkowo, mogę chcieć dodać dodatkowe filtry (na przykład do order_mainTable).
Oto jeden przykład, który próbowałem zrobić, i był dość blisko, ale nie jestem pewien, czy jest to "poprawny" sposób, i nie był w stanie pogrupować go według rozmiaru i koloru z zamówień_produktów.
from pmt in products_mainTable
let Purchases =
from opt in pmt.orders_productsTable
where ((opt.orders_mainTable.flags & 1) == 1)
where ((opt.orders_mainTable.date_completedon > Convert.ToDateTime("01/01/2009 00:00:00")))
select opt
orderby pmt.sku
select new {
pmt.guid,
pmt.sku,
pmt.name,
pmt.price,
AvgPerOrder = Purchases.Average(p => p.qty).GetValueOrDefault(0),
QtySold = Purchases.Sum(p => p.qty).GetValueOrDefault(),
SoldFor = Purchases.Sum(p => p.itemprice * p.qty).GetValueOrDefault()
}
* Edycja:
się być nieco bardziej wyraźne, więc można zrozumieć, co próbuję zrobić, tutaj jest kilka wyjaśnień.
Produkty są przechowywane w products_mainTable Zamówienia są przechowywane w orders_mainTable produkty, które zostały zamówione są przechowywane w orders_productsTable
Chcę utworzyć kilka raportów opartych na produktach, zamówieniach itp wiercenia do danych i znalezienia sensu bity do wyświetlenia użytkownikowi końcowemu.
W tym przypadku próbuję pokazać, które produkty zostały zakupione przez pewien czas i są najbardziej popularne. Ile sprzedano, za jaką cenę, i jaka jest wyprzedaż na zamówienie. Może nie najlepsza kolejność, ale eksperymentuję i wybrałem tę.
Wszystkie tabele mają związki z innymi tabelami. Tak więc z tabeli produktów mogę dostać się do zamówień zamówionych dla tego produktu, itp.
Największy problem, jaki mam, to zrozumienie działania LINQ, szczególnie w przypadku grupowania, agregowania danych, rozszerzeń, podzapytań itp. zabawne, ale zaczyna być frustrujące, ponieważ mam trudności ze znalezieniem szczegółowych wyjaśnień, jak to zrobić.
Tego rodzaju rzeczy stają się skomplikowane i zaczynają wprowadzać wyniki wydajności. Możesz spróbować napisać widok za pomocą wstawionego SQL, a następnie wskazać LINQ w widoku. – willasaywhat
Coś, o czym nie myślałem, dziękuję Rycerzowi Otchłani. –