简体   繁体   English

LINQ实体框架中的WITH语句

[英]WITH statement in LINQ Entity Framework

I got a SQL code like this which I'm going to use in a .NET application, I'm familiar with LINQ but I don't know what to do with the WITH statement. 我有一个这样的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

EDIT: The ROW_NUMBER() seems to be hard aswell, how do I do that? 编辑:ROW_NUMBER()似乎也很难,我该怎么做?

Thanks 谢谢

It looks like you're taking the first record in each key grouping where rev is 0 or equals the revnum parameter. 看起来您正在获取每个键组中的第一条记录,其中rev为0或等于revnum参数。 You can do that in Linq with: 您可以在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());

if records contains more that the three fields in the query then just add 如果记录包含的内容超过查询中的三个字段,则只需添加

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

Save the query as a stored procedure and using LINQ, call the stored procedure (see here: http://msdn.microsoft.com/en-us/library/bb918119.aspx ). 将查询另存为存储过程,并使用LINQ,调用该存储过程(请参阅此处: http : //msdn.microsoft.com/zh-cn/library/bb918119.aspx )。 Something like this: 像这样:

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

Create Inline table valued function from your code 通过代码创建内联表值函数

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

Drop this function to your DBML designer. 将此功能交给您的DBML设计器。 This way you'll get the fastest execution time and easiest way of implementation. 这样,您将获得最快的执行时间和最简单的实施方式。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM