繁体   English   中英

如何将具有RowNumber()的查询转换为LINQ?

[英]How can I convert my query featuring RowNumber() to LINQ?

以下是我的SQL代码:

create Table Dept
(
  DeptNo int identity (1,1) primary key,
  DeptName VarChar(255)
  )

create table Emp
(
  EmpNo int identity(1,1) primary key,
  FirstName VarChar(255),
  LastName VarChar(255),
  DeptNo Int Foreign Key references Dept(DeptNo),
  Salary Int Default 0
  )

insert into dept values ('Operations')
insert into dept values ('Sales')
insert into dept values ('Marketing')
insert into dept values ('HR')
insert into dept values ('Maintenance')

Insert into Emp values ('Danny', 'Rancher', 1, 16000)
insert into emp values ('Test1', 'Test1', 1, 16500)
insert into emp values ('Test2', 'Test2', 2, 10000)
insert into emp values ('Test3', 'Test3', 2, 21000)
insert into emp values ('Test4', 'Test4', 2, 17000)
insert into emp values ('Test5', 'Test5', 3, 5000)
insert into emp values ('Test6', 'Test6', 3, 45000)
insert into emp values ('Test7', 'Test7', 3, 27000)
insert into emp values ('Test8', 'Test8', 4, 23000)
insert into emp values ('Test9', 'Test9', 4, 22000)
insert into emp values ('Test10', 'Test10', 4, 10000)
insert into emp values ('Test11', 'Test11', 4, 50000)

-- Query to get all employees sorted by department and then by highest salaries
select * from emp order by deptno, salary desc

-- Query to get top 2 employees from each department with the highest salaries
SELECT Emp.EmpNo,
       Emp.FirstName, 
       Emp.LastName, 
       Emp.DeptNo,
       Emp.Salary 
FROM (SELECT ROW_NUMBER() OVER ( PARTITION BY DeptNo ORDER BY Salary DESC ) AS 'RowNumber', 
             EmpNo
      FROM Emp 
      ) SubQuery, 
      Emp 
WHERE RowNumber <= 2 
  AND SubQuery.EmpNo = Emp.EmpNo

如何将查询(特别是RowNumber子句)转换为Linq 2 SQL查询? 谢谢。

我似乎无法像这个问题一样应用select的索引重载

这可以在内存中使用数组。 不确定它将转换为数据库调用的程度。 (更新:重组的代码,因此重要的部分在最前面)

void Main()
{
    var Emps = Emp.GetData();

    var q = (from d in (from e in Emps
            group e by e.DeptNo)
            select d.Take(2)).SelectMany(e=>e);

    q.Dump();
}

// Boring setup details

class Emp
{
    public int EmpNo {get; set;}
    public string  FirstName {get; set;}
    public string LastName {get; set;}
    public int DeptNo {get; set;}
    public int Salary {get; set;}

    public Emp(int no, string fn, string ln, int de, int sal)
    {
        this.EmpNo = no;
        this.FirstName = fn;
        this.LastName = ln;
        this.DeptNo = de;
        this.Salary = sal;
    } 

    static public Emp[] GetData()
    {
    return new Emp[] {
        new Emp (1,"Danny", "Rancher", 1, 16000),
        new Emp (2,"Test1", "Test1", 1, 16500),
        new Emp (3, "Test2", "Test2", 2, 10000),
        new Emp (4, "Test3", "Test3", 2, 21000),
        new Emp (5, "Test4", "Test4", 2, 17000),
        new Emp (6, "Test5", "Test5", 3, 5000),
        new Emp (7, "Test6", "Test6", 3, 45000),
        new Emp (8, "Test7", "Test7", 3, 27000),
        new Emp (9, "Test8", "Test8", 4, 23000),
        new Emp (10, "Test9", "Test9", 4, 22000),
        new Emp (11, "Test10", "Test10", 4, 10000),
        new Emp (12, "Test11", "Test11", 4, 50000)  
    };
    }

}

暂无
暂无

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

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