2016-03-03 242 views
0

我嘗試使用Lambda表達式進行復雜查詢(而不是我)。我有我想要「翻譯」到Lambda的SQL。在Lambda表達式中使用Max,Group By,Join和Where

SELECT MAX((SUBSTRING(tbp.dt,4,4)+SUBSTRING(tbp.dt,2,2)+SUBSTRING(tbp.dt,1,2))) as Dt, 
tb._n, tbp.number, tbp.dsc 
FROM TB_A tb 
JOIN TB_B_C tbp ON tbp.number = tb.number 
WHERE tbp.rec = 0 AND tbp.processing = 0 AND tb._n != '' AND tbp.error = 0 
GROUP BY tb._n, tbp.number, tbp.dsc 

到現在爲止我有這樣的Lambda表達式:

var results = db.a 
      .Join(db.b_c, proc => proc.number, andam => andam.number, (proc, andam) => new { proc, andam }) 
      .Where(d => d.proc._n != "" && d.andam.rec == false && d.andam.processing == false && d.andam.error) 
      .ToList(); 

我要如何完成我的選擇有相同的結果SQL查詢?如果可能,你可以解釋在將查詢翻譯成Lambda時如何正確思考?

非常感謝。

+2

你問我們你錯過了什麼,先告訴我們它有什麼問題。 –

+0

這也有助於查看您的實體。例如,如果你有一個從'a'到'b_c'的導航屬性,那麼你不需要進行連接。 – juharr

+0

@TimSchmelter謝謝!我改變了我提出問題的方式! –

回答

1

它通常是更容易查詢語法來寫

var results = from tb in db.a 
       join tbp in db.b_c on tb.number equals tbp.number 
       where tbp.rec == 0 
        && tbp.processing == 0 
        && tb._n != string.Empty 
        && tbp.error == 0 
       group new {tb, tbp} by new {tb._n, tbp.number, tbp.dsc} into grp 
       select new 
       { 
        grp.Key._n, 
        grp.Key.number, 
        grp.Key.dsc, 
        Dt = grp.Max(x => x.tbp.dt.Substring(4,4) 
            + x.tbp.dt.Substring(2,2) 
            + x.tbp.dt.Substring(0,2)) 
       }; 
+0

非常感謝!有用! –

0

所有你需要做的是

1)GroupBySelect聲明

2)添加到用GroupJoin代替Join

下面的例子是不相關的數據庫模式...

選項1)

var results = ... 
      .GroupBy(x=> new {x.Field1, x.Field2, x.Field3}) 
      .Select(grp=>new 
      { 
       Key = grp.Key, 
       MaxVal = grp.Max(o=>o.Field1) 
      }); 

選項2)

var result = db_a.Where(x=>x.Field1==1 && x.Field2==0) 
      .GroupJoin(db_b.Where(x=>x.Field3==5), 
         a => a.PrimaryKey, 
         b => b.ForeignKey, 
         (a, b) => new 
          { 
           PK=a.PrimaryKey, 
           MaxVal=b.Max(o=>o.Field2) 
          }); 

來源:https://msdn.microsoft.com/en-us/library/bb534297%28v=vs.110%29.aspx