2013-04-07 60 views
2

我有一個SQL查詢嵌套查詢查詢LINQ到實體在同一個表

var data = (from A in _context.svr 
      join V in _context.svt on A.svtId equals V.Code 
      join U in _context.svu on A.Id equals U.Id into groupA 
      from gA in groupA.DefaultIfEmpty() 
      where V.Code == _openBalanceRecordId && 
       A.Id == (from B in _context.svr 
          join st in _context.sts on B.Id equals st.Id into groupB 
          from gB in groupB.DefaultIfEmpty() 
          where A.svsId == B.svsId && 
           B.ItemId == _item && 
           B.Date < _startDate.Date 
          select B.Id).Max() 
      select new 
      { 
       A.stock_value_site, 
       A.BALANCE_QUANTITY, 
       A.BALANCE_NOMINAL_VALUE, 
       A.BALANCE_INDEXED_VALUE, 
       V.STOCK_VALUE_ORDER, 
       gA == null ? 0 : gA.BALANCE_QUANTITY 
      }).Distinct().ToList(); 

當我運行SQL在oracle中查詢我得到33條記錄。但是當我使用Linq將它運行到實體時,我沒有得到任何記錄。

我在做什麼錯?

+0

「_item」和「_from_date」的表格是什麼?另外'B.Id = sts.ID和... B.Id IS NULL' - 這兩個都不可能是真的,因爲如果'B.ID'爲'null',它不能等於'sts.ID', – 2013-04-07 12:53:01

+0

_item ,_from_aate,_startDate都是變量而不是表格。 – Shpongle 2013-04-07 12:56:17

+0

是的,我很抱歉,我的錯誤..將編輯 – Shpongle 2013-04-07 13:00:16

回答

0

我相信還是有一些問題,你原來的查詢,如果我理解你想要做什麼,這應該更好地工作:

var results = 
    (from a in _context.svr 
    from v in _context.svt.Where(t => t.Code == 500) 
    join u in _context.svu on u.Id equals a.Id into gU 
    from x in gU.DefaultIfEmpty() 
    where a.Id == 
     (from b in _context.svr 
      join s in _context.sts on b.Id equals s.Id 
      where b.item = _item 
      and b.date < _from_date 
      and b.svsId == a.svsId 
      select b.Id).Max() 
    select new 
    { 
     a.stock_value_site, 
     a.BALANCE_QUANTITY, 
     a.BALANCE_NOMINAL_VALUE, 
     a.BALANCE_INDEXED_VALUE, 
     v.STOCK_VALUE_ORDER, 
     x == null ? 0 : x.BALANCE_QUANTITY 
    }).Distinct().ToList(); 

或者可能是這樣的:

var results = 
    (from a in _context.svr 
    from v in _context.svt.Where(t => t.Code == 500) 
    join u in _context.svu on u.Id equals a.Id into gU 
    from x in gU.DefaultIfEmpty() 
    let subQuery = 
     (from b in _context.svr 
      join s in _context.sts on b.Id equals s.Id 
      where b.item = _item 
      and b.date < _from_date 
      select new { b.Id, b.svsId }) 
    join y in subQuery on a.svsId equals y.svsId into gY 
    where a.Id = y.Max(b => b.Id) 
    select new 
    { 
     a.stock_value_site, 
     a.BALANCE_QUANTITY, 
     a.BALANCE_NOMINAL_VALUE, 
     a.BALANCE_INDEXED_VALUE, 
     v.STOCK_VALUE_ORDER, 
     x == null ? 0 : x.BALANCE_QUANTITY 
    }).Distinct().ToList(); 
+0

我嘗試您提出的第一個查詢,它的作用就像一個魅力。非常感謝你。您能否介紹where子句中提供的嵌套查詢?我還注意到,你從查詢中找到了'st'表(dbset)爲什麼? – Shpongle 2013-04-07 13:46:24

+0

@Shpongle哎呀!這實際上是一個錯字。你的SQL查詢有一個內部連接(有點),但你的Linq有一個左連接。我只寫了我的查詢來嘗試匹配您的原始SQL。實際上,如果你正在做一個左連接,但是沒有從'st'中選擇任何東西,你可以把連接放在'sts'上。 – 2013-04-07 13:50:09