【问题标题】:LINQ Syntax for Current Revision当前版本的 LINQ 语法
【发布时间】:2012-02-08 01:45:48
【问题描述】:

如何使用 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 查询中进行分组时都会出现错误

不支持分组方式

【问题讨论】:

  • 您能添加一个您之前尝试过的代码示例吗?
  • 您是否将实体框架与 Oracle Provider 一起使用?
  • 其实GroupBy可能就是这样;您的 Linq 提供商不支持。我至少在 NHibernate 提供程序中体验过这一点。
  • 抱歉耽搁了各位,我们正在使用 EF 与我们的 Oracle 数据库进行交互。我们也在使用 ODP.Net。

标签: c# linq exception-handling group-by oracle11g


【解决方案1】:

试试这样的:

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

【讨论】:

    【解决方案2】:

    在我的脑海中,不知道您正在使用哪个 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 的语法和 LINQPad 等工具的使用。
    • 现在我已经在我们数据库中的多个表上尝试过您的建议,我真的想再次感谢您,我们有很多表可以跟踪修订,学习这种语法至关重要。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2010-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-09
      • 2016-12-25
      • 2011-04-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多