2014-01-13 5 views
1

Я никогда не пользовался до Linq и на самом деле не хватает времени на учебу. Моих маленьких знаний недостаточно для этого, и мне нужна твоя помощь. Вот код, который мне нужно преобразовать в Linq. (Я использую Ef6 и контекст)Нужна помощь в преобразовании T-Sql в Linq

WITH messages AS (
    SELECT s.siteId,s.originator,s.sentTime,s.mode,s.mainsFrequency,s.gensetFrequency, 
      s.dgBattery,s.runHours,s.fuel,s.messageID,s.messageText, 
      ROW_NUMBER() OVER(PARTITION BY s.originator 
           ORDER BY s.sentTime DESC) AS rk 
     FROM smsParseds s) 
SELECT m.* 
FROM messages m 
WHERE m.rk = 1 
order by m.sentTime DESC 
+1

Так что, если у вас нет времени, чтобы понять это самостоятельно, что заставляет вас думать, что кто-то здесь должен потратить время, чтобы выполнить вашу работу за вас? – MattD

+1

Спасибо. Я проверил оба способа, заданные dagarrison & Aducci. за работой. Постскриптум в Linq «DESC» должно быть «нисходящим». –

ответ

-1

Это не прямой перевод (Entity Framework не может использовать номер строки), но результаты должны быть такими же

var query = from m in context.Messages 
      where (from x in context.Messages 
        where m.Originator == x.Originator 
        where x.SentTime > m.SentTime 
        select x).Any() == false 
      orderby m.SentTime desc 
      select new 
      { 
       m.siteId, 
       m.originator, 
       m.sentTime, 
       m.mode, 
       m.mainsFrequency, 
       m.gensetFrequency, 
       m.dgBattery, 
       m.runHours, 
       m.fuel, 
       m.messageID, 
       m.messageText, 
      }; 
+0

Поскольку исходные фильтры запросов основаны на разделе, этот запрос возвращает еще много строк, чем требуется. – davidgarrison

+0

@ dagarrison, Как так? Предложение where включает только последние записи от каждого оригинатора. – Aducci

+0

О, я понимаю, что вы делаете. Вы правы, моя ошибка. Мне нужно всего лишь несколько минут, чтобы обработать именно то, что делает 'x.SentTime> m.SentTime'. – davidgarrison

0

см Row_number over (Partition by xxx) in Linq? для этого раздела.

Остальное - довольно простой синтаксис linq.

Я не тестировал это или пытался его скомпилировать, поэтому может потребоваться небольшая модификация. Я просто разделил вопрос, похожий на вопрос, только для ясности, но их можно легко объединить в одну строку.

var messages = smsParseds 
    .OrderBy(o => o.sentTime).GroupBy(g => g.originator) 
    .Select(s => new {s, rk = s.Count()}) 
    .SelectMany(sm => sm.s.Select(b => b) 
     .Zip(Enumerable.Range(1,sm.rk), (j,i) => new {j.siteId, j.originator, j.sentTime, j.mode, j.mainsFrequency, j.gensetFrequency, j.dgBattery, j.runHours, j.fuel, j.messageID, j.messageText, rk = i})); 

var result = messages 
    .Where(w => w.rk = 1) 
    .OrderByDescending(o => o.sentTime) 

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

  • Нет связанных вопросов^_^