当前修订版的 LINQ 语法

发布于 2024-12-26 09:58:29 字数 572 浏览 2 评论 0原文

如何使用 C# 和 LINQ 编写此 SQL 语句?我正在查询 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

How can I write this SQL statement using C# and LINQ? I am quering an Oracle database and the table has multiple revisions of the records. Therefore, I want onyl the current revision of each record contained in the table.

The SQL looks like this:

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 is the date time field that stores the current revision.

I am a beginner with LINQ and have been struggling to find an workable solution. Every time that I try grouping in the LINQ query I get an error

GroupBy is not supported

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

末蓝 2025-01-02 09:58:29

尝试这样的事情:

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

Try something like this:

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
                };
删除会话 2025-01-02 09:58:29

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

Off the top of my head, and not knowing which LINQ provider you're using...

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
        };
深爱成瘾 2025-01-02 09:58:29

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

If you're using entity framework or linq-to-sql, you can just pass the direct sql if you want (although that'll prevent change tracking, at least by default).

For EF, use ObjectContext.ExecuteStoreQuery: http://msdn.microsoft.com/en-us/library/dd487208.aspx

For L2S, use DataContext.ExecuteQuery: http://msdn.microsoft.com/en-us/library/system.data.linq.datacontext.executequery.aspx

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文