C# 将我的SQL翻译成LINQ
我正在尝试将我的SQL代码转换为c代码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
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部件测试,而且比较容易,但我真的认为应用临时表是不可能的。这样做有什么好处?表演更好的代码可读性?