2016-03-03 2 views
0

Я пытаюсь сделать сложный запрос (вместо этого мне) с помощью выражения Lambda. У меня есть SQL, который я хочу «перевести» на Lambda.Использование Max, Group By, Join и Where in Lambda Expression

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 

До сих пор у меня это лямбда-выражение:

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? Если возможно, вы можете объяснить, как правильно мыслить при переводе запроса на Лямбду?

Большое спасибо.

+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) добавить GroupBy и Select заявления

или

2) заменить Join на GroupJoin.

Ниже примеры не связанные с вашей схемы базы данных ...

Вариант 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