Синтаксис LINQ для текущей версии - PullRequest
1 голос
/ 11 января 2012

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

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 не поддерживается

Ответы [ 3 ]

0 голосов
/ 11 января 2012

Попробуйте что-то вроде этого:

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 голосов
/ 14 января 2012

Если вы используете платформу сущностей или 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

0 голосов
/ 11 января 2012

Сверху головы, и не зная, каким провайдером 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
        };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...