当前修订版的LINQ语法

本文关键字:LINQ 语法 修订版 | 更新日期: 2023-09-27 18:20:12

如何使用C#和LINQ编写此SQL语句?我正在查询一个Oracle数据库,该表对记录进行了多次修订。因此,我想要onyl表中包含的每个记录的当前修订。

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

当前修订版的LINQ语法

试试这样的东西:

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
                };

我突然想到,不知道你在使用哪个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
        };

如果您使用实体框架或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