2015-06-22 2 views
2

У меня есть следующий запрос MSSQL, который я пытаюсь преобразовать в LINQ. Я использую сущность framework со следующим синтаксисом, чтобы получить данные.Как преобразовать этот оператор tSQL в LINQ, используя группу в подзапросе

var rv = (from i in DC.TableA select i).ToList(); 

Это SQL Я хочу написать C# LINQ запрос для но я не могу понять это. Может кто-нибудь помочь?

select BTO.* 
from TableA BTO 
join 
(
    select eqnum, max(testdate) as testdate 
    from TableA BTO1 
    where 
     BTO1.eqnum in ('M0435', 'Z0843') and 
     BTO1.testdate <= '2008-06-01' 
    group by eqnum 
) T1 
on 
    T1.eqnum = BTO.eqnum and 
    T1.testdate = BTO.testdate 
    order by EqNum; 
+0

вы знакомы с инструментом под названием 'LinqPad' – MethodMan

ответ

2

Я думаю, что есть возможность переписать запрос, но для информационных целей я переписал свой sql в linq дословном.

Если вы объясните, что вы пытаетесь достичь, мы можем обеспечить альтернативный sql/linq

var eqnums = new[] { "M0435", "Z0843" }; 
var testdate = "2008-06-01"; 

var query = from bto in DC.TableA 
      join t1 in (
       from bto1 in DC.TableA 
       where eqnums.Contains(bto1.eqnum) && 
        bto1.testdate.CompareTo(testdate) <= 0 
       group bto1 by bto1.eqnum into g 
       select new 
       { 
        eqnum = g.Key, 
        testdate = g.Max(x => x.testdate) 
       } 
      ) on new { bto.eqnum, bto.testdate } equals new { t1.eqnum, t1.testdate } 
      orderby bto.eqnum 
      select bto; 
+0

Один из вопросов, с этим ответом является то, что testdate в БД на самом деле строка, а не соответствующий тип данных datetime. MSSQL обрабатывает max (testdate) и <= '2008-06-01' правильно, так как столбец отформатирован в 'yyyy-MM-dd', а операнд диапазона <<= работает как есть. Поскольку у меня нет возможности изменить это в базе данных, и я не хочу возвращать все данные и преобразовывать их в память на клиенте, и у меня есть около 30 миллионов строк, я хочу выполнить это на sql и возвращать как можно более разумные данные по проводу. –

+0

Запрос, который я опубликовал, работает очень эффективно и возвращает только нужные мне строки. Поскольку тип данных в БД является строкой, а не типом данных даты, функции max и т. Д. На стороне LINQ терпят неудачу, и я оставляю свои большие пальцы на том, как добиться этого. –

+0

@KarlEasterly - я не понимал, что 'testdate' был' varchar'. Использование 'CompareTo' должно работать. Взгляните на мое обновление – Aducci

Смежные вопросы