2012-01-11 3 views
1

Как написать этот оператор SQL с помощью C# и LINQ? Я запрашиваю базу данных Oracle, и таблица имеет несколько ревизий записей. Поэтому я хочу, чтобы текущая ревизия каждой записи содержалась в таблице.LINQ Синтаксис для текущей версии

SQL, выглядит следующим образом:

select TP_ID, TP_TEXT, TP_DEFN_SAKEY 
from TP_DEFN tp1 
where tp1.TP_ACTIVE_FLAG = 'Y' and 
     tp1.FAMILY_ID = 1 and 
     tp1.TP_DEFN_REV_DTS = (select max(TP_DEFN_REV_DTS) 
from TP_DEFN tp2 
where tp2.family_id = tp1.family_id and tp2.tp_id = tp1.tp_id) 
order by TP_ID 

TP_DEFN_REV_DTS это поле даты и времени, который хранит текущую версию.

Я новичок в LINQ и изо всех сил пытаюсь найти работоспособное решение. Каждый раз, когда я пытаюсь группировки в запросе LINQ я получаю сообщение об ошибке

GroupBy не поддерживается

+1

Не мог бы вы добавить образец кода, что вы пробовали раньше? –

+2

Используете ли вы Entity Framework с поставщиком Oracle? – jrummell

+2

Собственно, 'GroupBy' может быть именно таким; не поддерживается вашим провайдером Linq. Я по крайней мере испытал это с поставщиком NHibernate. – lbergnehr

ответ

0

Off верхней части моей головы, и не зная, LINQ провайдер вы используете ...

var q = from tp1 in Context.TP_DEFN 
     where tp1.TP_ACTIVE_FLAG == "Y" 
      && tp1.FAMILY_ID == 1 
      && tp1.TP_DEFN_REV_DTS 
       == Context.TP_DEFN.Where(tp2 => tp2.FAMILY_ID == tp1.FAMILY_ID 
              && tp2.TP_ID == tp1.TP_ID) 
           .Max(tp2 => tp2.TP_DEFN_REV_DTS) 
     orderby tp1.TP_ID 
     select new 
     { 
      tp1.TP_ID, 
      tp1.TP_TEXT, 
      tp1.TP_DEFN_SAKEY 
     }; 
+0

Вау, спасибо Крэйг! Поскольку я опубликовал это, мы много узнали о синтаксисе LINQ и использовании таких инструментов, как LINQPad. –

+0

Теперь, когда я попробовал ваше предложение по нескольким таблицам в нашей БД, я действительно хотел бы снова поблагодарить вас, у нас есть много таблиц, где мы отслеживаем изменения и изучаем этот синтаксис. –

0

попробовать что-то вроде этого:

var res = 
       from tp1 in TP_DEFN 
       where tp1.TP_ACTIVE_FLAG == "Y" && 
       tp1.FAMILY_ID == 1 && 
       tp1.TP_DEFN_REV_DTS == (from tp2 in TP_DEFN 
             where tp2.FAMILY_ID == tp1.FAMILY_ID && 
             tp2.TP_ID == tp1.TP_ID 
             select tp2.TP_DEFN_REV_DTS).Max() 
       orderby tp1.TP_ID 
       select new 
       { 
        tp1.TP_ID, 
        tp1.TP_TEXT, 
        tp1.TP_DEFN_SAKEY 
       }; 
+0

Благодарим за информацию! –

0

Если вы используете рамки сущности или linq-to-sql, вы можете просто передать прямой sql, если хотите (хотя это предотвратит отслеживание изменений, по крайней мере, по умолчанию).

Для EF, используйте ObjectContext.ExecuteStoreQuery: http://msdn.microsoft.com/en-us/library/dd487208.aspx

Для L2S используйте DataContext.ExecuteQuery: http://msdn.microsoft.com/en-us/library/system.data.linq.datacontext.executequery.aspx

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