【问题标题】:WITH statement in LINQ Entity FrameworkLINQ 实体框架中的 WITH 语句
【发布时间】:2013-04-05 01:17:58
【问题描述】:

我有一个这样的 SQL 代码,我将在 .NET 应用程序中使用它,我熟悉 LINQ,但我不知道如何处理 WITH 语句。

WITH records
AS
(
    SELECT  [key], [rev], [IsCurrent],
            ROW_NUMBER() OVER(PARTITION BY [key]
            ORDER BY CASE WHEN [rev] = @revNUm          
            THEN 0 ELSE 1 END) rn
    FROM    tableName
    WHERE   [Rev] IN (@revNUm,0)
)
SELECT  [key], [rev], [IsCurrent]
FROM    records 
WHERE   rn = 1

编辑:ROW_NUMBER() 似乎也很难,我该怎么做?

谢谢

【问题讨论】:

  • 在数据库中创建一个视图并查询它,而不是尝试直接从 LINQ 进行相同的查询。
  • 你在 WITH 语句上阻塞很有趣。在你的地方,我会担心 ROW_NUMBER !

标签: sql sql-server linq entity-framework sql-to-linq-conversion


【解决方案1】:

将查询保存为存储过程并使用 LINQ 调用存储过程(参见此处:http://msdn.microsoft.com/en-us/library/bb918119.aspx)。像这样的:

CREATE PROCEDURE newprocedure
@revNUm INT
AS    
BEGIN
WITH records
AS
(
    SELECT  [key], [rev], [IsCurrent],
            ROW_NUMBER() OVER(PARTITION BY [key]
            ORDER BY CASE WHEN [rev] = @revNUm          
            THEN 0 ELSE 1 END) rn
    FROM    tableName
    WHERE   [Rev] IN (@revNUm,0)
)
SELECT  [key], [rev], [IsCurrent]
FROM    records 
WHERE   rn = 1
END

【讨论】:

    【解决方案2】:

    看起来您正在获取每个键分组中的第一条记录,其中 rev 为 0 或等于 revnum 参数。你可以在 Linq 中这样做:

     var query = db.records
                   .OrderBy(r => r.rev == revNum ? 0 : 1)
                   .Where(r => rev == 0 || rev == revNum)
                   .GroupBy(r => r.key)
                   .Select(g => g.First());
    

    如果记录包含的字段多于查询中的三个字段,则只需添加

                   .Select(r => new {r.key, r.rev, r.IsCurrent})
    

    【讨论】:

      【解决方案3】:

      从您的代码中创建内联表值函数

      CREATE FUNCTION YourFunction
      (   
      )
      RETURNS TABLE 
      AS
      RETURN 
      (
      WITH records
      AS
      (
          SELECT  [key], [rev], [IsCurrent],
                  ROW_NUMBER() OVER(PARTITION BY [key]
                  ORDER BY CASE WHEN [rev] = @revNUm          
                  THEN 0 ELSE 1 END) rn
          FROM    tableName
          WHERE   [Rev] IN (@revNUm,0)
      )
      SELECT  [key], [rev], [IsCurrent]
      FROM    records 
      WHERE   rn = 1
      )
      GO
      

      将此函数交给您的 DBML 设计器。这样您将获得最快的执行时间和最简单的实现方式。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-07-07
        • 1970-01-01
        • 2014-05-14
        • 2019-06-14
        • 1970-01-01
        • 1970-01-01
        • 2018-11-30
        • 1970-01-01
        相关资源
        最近更新 更多