【问题标题】:Using Row_Number of SQL Server in Linq在 Linq 中使用 SQL Server 的 Row_Number
【发布时间】:2015-03-13 14:00:26
【问题描述】:

我有一个表格,里面有类似的数据

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 的新手,所以甚至不知道如何开始这个查询。任何帮助将不胜感激。

【问题讨论】:

  • 我在您的示例数据中看不到 RowNum 列。您还没有在 sql 查询中使用 Row_Number 。所以这很模糊。
  • 那条 SQL 还能运行吗?看起来您使用的是名为 RowNum 的列,而不是 ROW_NUMBER() 函数。
  • 我的表没有 rownum 列,我需要使用 linq 添加它并获得以下输出。
  • 您需要在表中添加一列并填充它,还是需要计算查询中的行号?
  • 我需要将 rownum 列添加到临时表中,这样我就可以像在我的 sql 查询中所做的那样使用该表进行自我连接并获得所需的输出

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


【解决方案1】:

使用日期列通过使用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 我认为您的示例查询可能与第一个答案行有问题?

【讨论】:

    【解决方案2】:

    使用 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}
                */

    【讨论】:

    • 在关于 Linq-To-Sql 的问题中建议使用Linq-To-Objects 是没有意义的,不是吗?
    • 将结果 LINQ to SQL 获取到 Object 中并将 LINQ 应用于 Object。这是常识。甚至您可以直接将 Lembda 表达式应用于表类。
    • 所以你建议在整张桌子上使用AsEnumerable()?如果表很大,那将是非常低效的。它基本上是先将数据库加载到内存中。
    猜你喜欢
    • 2011-05-04
    • 2011-02-26
    • 2012-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-23
    相关资源
    最近更新 更多