【问题标题】:Convert Cross join of sql To Linq将sql的交叉连接转换为Linq
【发布时间】:2020-10-07 05:47:36
【问题描述】:

我有一张桌子

SELECT JM.jobNum+'.'+CONVERT(VARCHAR,TL.tlPhasenum) AS [COST CODE],EM.empnum+'‌' AS [EMPLOYEE NUMBER],TL.tlDateWorked AS [DATE],tl.tlOT,tl.tlStraightTime INTO #TempTable
FROM mqTimeReportingTimeLogs AS TL
    INNER JOIN mqJobMaster AS JM ON TL.tlJobId=JM.jobId
    INNER JOIN mqEmployeeMaster AS EM ON TL.tlEmployeeId=EM.empId
    WHERE 
    TL.tlCompanyId in (select * from #TempCompanies) 
    AND (@weekending='' or tlWeekEnding=CONVERT(DATE,@weekending)) 
    AND (@jobid=0 or TL.tlJobId=@jobid)
    AND (@startdate='' or TL.tldateworked between convert(date,@startdate) and convert(date,@enddate))

下面的查询将行拆分为两个

SELECT * INTO #TempTable2
 FROM (
    SELECT [COST CODE],[EMPLOYEE NUMBER],[DATE],value as [Hours],col as [Time Type]
    from #TempTable
    CROSS APPLY
    (
        VALUES('1',tlStraightTime),('2',tlOT) --1:ST  2:OT
    ) C (COL, VALUE)
 ) SRC

现在我想在 linq 中实现同样的东西,如何在 LINQ 中使用这个逻辑

【问题讨论】:

  • 也许我的SQL to LINQ Recipe 可能会帮助您翻译第一个查询。然后 CROSS APPLY 可以作为 from...from...select 完成。
  • 但是,我认为您无法在服务器端运行第二个查询,您必须先处理第一个查询,然后使用 LINQ to Objects。

标签: sql sql-server linq linq-to-sql


【解决方案1】:

TempTable 查询转换为 LINQ 后,类似于:

var TempTable = from tl in mqTimeReportingTimeLogs ...

然后您可以通过使用SelectConcat(例如SELECTUNION ALL)创建一个内联表来执行第二个查询,LINQ to SQL 可以翻译:

var ans = from t in TempTable
          from c in TempTable.Take(1).Select(_ => new { col = 1, value = t.tlStraightTime }).Concat(TempTable.Take(1).Select(_ => new { col = 2, value = t.tlOT }))
          select new {
              t.CostCode,
              t.EmployeeNumber,
              t.Date,
              c.col,
              c.value
          };

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-10
    • 2012-03-25
    • 2016-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-30
    • 2018-12-03
    相关资源
    最近更新 更多