在Linq中使用SQL Server的Row_Number

时间:2015-03-13 14:00:26

标签: c# sql linq linq-to-sql

我有一个包含

等数据的表格
Date         Users
------------------
01/03/2015    25
02/03/2015    28
04/03/2015    36
07/03/2015    45
08/03/2015    47

我使用Row_Number在Sql Server中创建了一个表值函数,它给出了我用于进一步处理的输出,如下所示

Date         Users      UsersAdded
----------------------------------
01/03/2015    25        0
02/03/2015    28        3
04/03/2015    36        8
07/03/2015    45        9
08/03/2015    47        2

但是,我现在需要在Linq中做同样的事情,但它没有Row_Number函数。我查看了How do I translate a query that uses ROW_NUMBER() into linq?,但这与我的查询无关。

我在SQL中的查询在日期字段上有Rownum,查询是

select date, Users, (T1.Users - isnull(T2.Users,0)) as UsersAdded
from tableuser T1 
join tableuser T2 on T1.Rownum = (T2.RowNum +1)

我是LINQ的新手,所以甚至不知道如何开始这个查询。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

使用日期列,使用from / where按左外连接查找下一个最低日期。

var ans = from t1 in tableuser from t2 in tableuser.Where(t2 => t2.Date == tableuser.Where(t3 => t3.Date < t1.Date).Max(t3 => t3?.Date)).DefaultIfEmpty()
          select new { t1.Date, t1.Users, UsersAdded = t1.Users - (t2?.Users ?? t1.Users)};

PS我认为您的示例查询可能与第一个答案行存在问题?

答案 1 :(得分:-4)

使用LINQ来对象。 请参阅链接https://msdn.microsoft.com/en-us/library/bb534869.aspx

它会像这样实现

string[] fruits = { "apple", "banana", "mango", "orange", 
                                  "passionfruit", "grape" };

            var query =
                fruits.Select((fruit, index) =>
                                  new { index, str = fruit.Substring(0, index) });

            foreach (var obj in query)
            {
                Console.WriteLine("{0}", obj);
            }

            /*
             This code produces the following output:

             {index=0, str=}
             {index=1, str=b}
             {index=2, str=ma}
             {index=3, str=ora}
             {index=4, str=pass}
             {index=5, str=grape}
            */