需要将此查询转换为linq或lambda

需要将此查询转换为linq或lambda,linq,tsql,sql-to-linq-conversion,Linq,Tsql,Sql To Linq Conversion,此查询将返回两列:userid列和当月总销售额的一列 我需要添加一个列对它们进行排序(它将与行#完全相同) 我需要将它从SQL转换为LINQ或Lambda select pu.userID, SUM(o.OrderTotal) as OrderTotal from ProPit_User pu inner join SeperateDB.dbo.orders o on pu.salesrepid = o.salesrepid and o.DateCompleted > '2014-05-0

此查询将返回两列:userid列和当月总销售额的一列

我需要添加一个列对它们进行排序(它将与行#完全相同)

我需要将它从SQL转换为LINQ或Lambda

select pu.userID, SUM(o.OrderTotal) as OrderTotal from ProPit_User pu
inner join SeperateDB.dbo.orders o on pu.salesrepid = o.salesrepid and o.DateCompleted > '2014-05-01' and o.DateCompleted < '2014-05-23'
group by pu.userID
order by SUM(o.OrderTotal) desc

要使用SQL捕获排名索引,只需修改当前SQL即可:

     SELECT pu.userid, 
            SUM(o.OrderTotal) AS OrderTotal, 
            ROW_NUMBER() OVER (ORDER BY SUM(o.ordertotal) DESC) AS [Rank]
       FROM ProPit_User pu
 INNER JOIN SeperateDB.dbo.Orders o ON pu.salesrepid = o.salesrepid 
        AND o.DateCompleted > '2014-05-01' AND o.DateCompleted < '2014-05-23'
   GROUP BY pu.userid
   ORDER BY SUM(o.OrderTotal) DESC
不确定要在哪个上下文中“转换为LINQ”。如果您指的是EF或linq to Sql上下文中针对这两个表的linq查询,那么这些语句将产生与上面相同的结果:

var minDate = new DateTime(2014,5,1);
var maxDate = new DateTime(2014,5,23);

-- the linq to sql query:
-- join on salesrepid, group by userid, sum the ordertotals
var dbQuery = ProPit_Users.GroupJoin(
 Orders,
 pu => pu.salesrepid,
 o => o.salesrepid,
 (pu, orders) => new 
    {
      pu.UserId, 
      OrderTotal = orders.Where(o => o.datecompleted > minDate && o.datecompleted. < maxDate )
                         .Sum(o => o.ordertotal)
    }
 )
 .OrderByDescending(row => row.OrderTotal)
 -- materialize the db query
 .ToList();

 -- add ranking to the results of the query
 var userRankings = dbQuery.Select((row, idx) => new { Rank = ++idx, row.UserId, row.OrderTotal });

Row不同于Rank,您应该阅读本文了解您的需要。至于转换,不是我的强项。按顺序排列,行等于秩。第一排将排在第一位。等等。我也来看看这篇文章。你问了同样的问题(至少是第一部分)。同样的最终结果,不同的方法。您链接的问题是通过尝试获取列表的索引。这是通过SQL请求的,然后转换为LINQ/Lambda@SimonBelanger@JaazCole另外,两个人可能会有完全相同的销售,这将是太低,不必担心。我会尝试这一点,明天第一件事。我现在太困了,但是谢谢你发帖。我期待着尝试一下!:)我不能让它工作。它不允许我使用两种不同的上下文。我需要连接的每个表都在一个单独的数据库中。知道怎么解决吗?啊。我给您的linq会发出sql来连接两个表,因此无法跨服务器工作。如果您将两个基础数据集拉入两个列表,可能首先按数据范围过滤,查询本身仍将作为一个简单的linq to objects语句工作。我将Orders表放入它自己的对象中,然后将它们连接起来,现在它的工作就像一个符咒。谢谢
userID  OrderTotal Rank
340     68992.74   1
318     49575.05   2
228     42470.88   3
etc
var minDate = new DateTime(2014,5,1);
var maxDate = new DateTime(2014,5,23);

-- the linq to sql query:
-- join on salesrepid, group by userid, sum the ordertotals
var dbQuery = ProPit_Users.GroupJoin(
 Orders,
 pu => pu.salesrepid,
 o => o.salesrepid,
 (pu, orders) => new 
    {
      pu.UserId, 
      OrderTotal = orders.Where(o => o.datecompleted > minDate && o.datecompleted. < maxDate )
                         .Sum(o => o.ordertotal)
    }
 )
 .OrderByDescending(row => row.OrderTotal)
 -- materialize the db query
 .ToList();

 -- add ranking to the results of the query
 var userRankings = dbQuery.Select((row, idx) => new { Rank = ++idx, row.UserId, row.OrderTotal });
Rank UserID  OrderTotal
1    340     68992.74  
2    318     49575.05  
3    228     42470.88  
etc