2013-04-23 14 views
21

jestem delegowania jeszcze jedną wątpliwość kopalni: Czy istnieje sposób, za pomocą którego możemy użyć wynik jednego zapytania, a następnie dołączyć samo dalej tak jak my w SQL:Dołącz wynik podzapytania w Linq

SELECT Applications.* , ApplicationFees.ApplicationNo, ApplicationFees.AccountFundDate1,ApplicationFees.AccountFundDate2 ,ApplicationFees.AccountFundDate3 , ApplicationFees.AccountCloseDate1, ApplicationFees.AccountCloseDate2,ApplicationFees.AccountCloseDate3, 
isnull(SUBQRY11.AMNT ,0) as SCMSFEE1R, 
isnull(SUBQRY12.AMNT,0) as SCMSFEE2R, 
Left Join 
(
SELECT ApplicationNo,COUNT(ApplicationNo) AS CNT, SUM(Amount) as AMNT 
FROM Payments where (FEETYPE=1 AND FeePosition=1) and (FeeDate>='2011-01-01') 
and (FeeDate<='2012-01-01') 
GROUP BY ApplicationNo 
)SUBQRY11 
ON ApplicationFees.ApplicationNo= SUBQRY11.ApplicationNo 
Left Join 
(
SELECT ApplicationNo,COUNT(ApplicationNo) AS CNT2, SUM(Amount) as AMNT 

FROM Payments where (FEETYPE=1 AND FeePosition=2) and (FeeDate>='2011-01-01') 
and (FeeDate<='2012-01-01') 
GROUP BY ApplicationNo)SUBQRY12 ON ApplicationFees.ApplicationNo=SUBQRY12.ApplicationNo 

Chcę tego samego uniknąć w zapytaniu, ponieważ będzie to dość czasochłonne.

Odpowiedz

37

Tak, można dołączyć do zapytań podrzędnych. W ten sposób:

var query = from f in db.ApplicationFees 
      join sub in (from p in db.Payments 
         where p.Type == 1 && p.Position == 1 && 
           p.Date >= fromDate && p.Date <= toDate 
         group p by p.ApplicationNo into g 
         select new { 
           ApplicationNo = g.Key, 
           CNT = g.Count(), 
           AMNT = g.Sum(x => x.Amount) 
         }) 
      on f.ApplicationNo equals sub.ApplicationNo into feePayments 
      select new { Fee = f, Payments = feePayments }; 

Ale pisanie w pojedynczej kwerendzie nie jest bardzo łatwe w utrzymaniu. Rozważmy komponować zapytanie z sub-zapytań zdefiniowane oddzielnie:

var payments = from p in db.Payments 
       where p.Type == 1 && p.Position == 1 && 
       p.Date >= fromDate && p.Date <= toDate 
       group p by p.ApplicationNo into g 
       select new { 
        ApplicationNo = g.Key, 
        CNT = g.Count(), 
        AMNT = g.Sum(x => x.Amount) 
       }; 

var query = from f in db.ApplicationFees 
      join p in payments 
       on f.ApplicationNo equals p.ApplicationNo into feePayments 
      select new { Fee = f, Payments = feePayments }; 
+1

Dobrze pozwól mi spróbować to samo i będę wrócić, również dziękuję za szybką obsługą –

+1

Więc jest to bardzo przydatne i dołączyło prawie dziewięć sprawy w tym samym. :) –

+0

Ale prawdopodobnie jedno zapytanie jest lepsze w przypadku wydajności (niż dwa oddzielne zapytania)? – psur

Powiązane problemy