C# 将我的SQL翻译成LINQ

C# 将我的SQL翻译成LINQ,c#,sql,linq,C#,Sql,Linq,我正在尝试将我的SQL代码转换为c代码linq代码。这只是我代码的一小部分,因为实际代码太长了 My SQL Declare @ReportDate DateTime = NULL SELECT DISTINCT LotId, PenId, SUM(Head) AS TotalHead INTO #LotPenAlloctionListTempTable FROM ( SEL

我正在尝试将我的SQL代码转换为c代码linq代码。这只是我代码的一小部分,因为实际代码太长了

My SQL 
    Declare @ReportDate DateTime = NULL
    SELECT DISTINCT LotId, PenId, SUM(Head) AS TotalHead
            INTO #LotPenAlloctionListTempTable
                FROM (
                        SELECT  lp.LotId, lp.PenId, lp.HeadCountInPen  AS Head
                            FROM scoFeedlot.LotPen AS lp    

                        UNION
                        SELECT LotHistory.LotId, LotHistory.PenId, IIF(LotHistory.Direction = 1, LotHistory.Head * -1, LotHistory.Head) AS Head
                            FROM scoFeedlot.LotHistory                      
                            WHERE CAST(LotHistory.MovementDate AS DATE) > '2017-7-27' AND LotHistory.IsPending = 0 AND LotHistory.IsCancelled = 0
                    ) A GROUP BY Lotid, PenId

    Select Distinct [scoFeedlot].[Pen].PenName,[scoFeedlot].LotMaster.Lotnumber,[scoFeedlot].LotPen.HeadCountInPen
    from 
    #LotPenAlloctionListTempTable
我的C代码

public async Task<int> GetHeadCountInPenLotPens(DateTimeOffset date)
{
    var lotPens = await _context.LotPens.ToListAsync();
    var lotHistory = await _context.LotHistories.ToListAsync();
}

没有你的桌子很难说,但这应该有用:

var a = (_context.LotPen.Select(lp=> new LotPenHead 
                    { 
                       LotId= lp.LotId, 
                       PenId = lp.PenId, 
                       Head = lp.HeadCountInPen
                    })
          .Concat(_context.LotHistory
                       .Where(lh=>lh.MovementDate > new DateTime(2017,7,27) 
                               && !lh.IsPending && !lh.IsCancelled)
                       .Select(lh=>new LotPenHead 
                          { 
                               LotId= lh.LotId, 
                               PenId = lh.PenId, 
                               Head = lh.Direction == 1 ? -lh.Head : lh.Head
                          }));

var results = a.GroupBy(aa=>new {aa.LotId, aa.PenId}, aa=>aa.Head)
               .Select(aa=>new LotPenHead
                           {
                              LotId = aa.Key.LotId, 
                              PenId = aa.Key.PenId, 
                              Head=aa.Sum()
                           }).ToList();

我不认为你可以应用临时表或IIF部分在linq@SKLTFZ虽然不是这样,但您可以在LINQ中更优雅地执行相同的概念逻辑,而不必留下数据库工件,如批处理范围的临时表。校正:您可以进行IIF部件测试,而且比较容易,但我真的认为应用临时表是不可能的。这样做有什么好处?表演更好的代码可读性?