2013-06-04 52 views
0

我在Linq非常新手,不知道如何解決一些問題,即使在MS SQL查詢中非常容易。如何將臨時表與case語句SQL轉換爲Linq?

Select e.EmployeeID 
, e.EmployeeName 
, e.Division 
, e.DepartmentCode 
, e.DesignationGrpCode 
Into #temp 
from chr.dbo.EMPLOYEE e 
Where e.DepartmentCode in ( 
         Select DepartmentCode 
         from chr.dbo.EMPLOYEE 
         where EmployeeID = 'S-1287' 
         ) 

Select * from #temp t 
where t.EmployeeID in (
         Case When t.Division <> 'CHR' Then (Select EmployeeID from #temp where DesignationGrpCode = 'CorpDMGR') 
         Else (Select EmployeeID from #temp where DesignationGrpCode = 'MGT') End) 
Drop table #temp 

如何轉換此查詢到LINQ?請

這裏是我的LINQ語句

var employee = new Common().Employee(); 

     var jobdesc = new Common().JobHistory(); 

     List<EMPLOYEE> dCode = (from e in employee 
           where e.EmployeeID == "S-1204" 
           select new EMPLOYEE 
           { 
            DepartmentCode = e.DepartmentCode 
           }).ToList(); 

     List<EMPLOYEE> emp = (from e in employee 
      join d in dCode on e.DepartmentCode equals d.DepartmentCode into temp 
      from t in temp.DefaultIfEmpty() 


      orderby e.EmployeeName 
      select new EMPLOYEE 
      { 
       EmployeeID = e.EmployeeID, 
       EmployeeName = e.EmployeeName 
      }).ToList(); 

但逼債知道如何檢查CASE ELSE語句

+0

請添加您製作的LINQ,但沒有做你以前的工作。 – Bazzz

+0

@Bazzz嗨,請檢查,它已更新! – CMMaung

回答

1

給這一個去吧。它編譯並運行在ideone,但是否則未經測試,所以祝你好運。

var temp = from e in context.EMPLOYEE 
      where (from f in context.EMPLOYEE 
        where f.EmployeeID == "S-1287" 
        && e.DepartmentCode == f.DepartmentCode 
        select f).Any() 
      select e; 

var result = from t in temp 
      where (from u in temp 
        where u.DesignationGrpCode 
          == (t.Division == "CHR" ? "CorpDMGR" : "MGT") 
        && t.EmployeeID == u.EmployeeID 
        select u).Any() 
      select t; 

假設你指向SQL Server 2005或以上,我希望LINQ是足夠聰明,把臨時表到一個WITH子句。

UPDATE:由於temp的子查詢幾乎肯定會返回一個值,你應該(假設僱員是主鍵),它分離出來:

string deptForS1287 = (from e in context.EMPLOYEE 
         where e.EmployeeID == "S-1287" 
         select DepartmentCode).Single(); 

var temp = from e in context.EMPLOYEE 
      where e.DepartmentCode == deptForS1287 
      select e; 

⋮ 

這有拋出異常的附帶好處如果EMPLOYEE表沒有提到員工S-1287。

+0

嗨兄弟,你的代碼看起來像完美的工作,我用這個,沒有錯誤,但沒有數據出來。真混淆了一個!你有什麼想法嗎? – CMMaung

+1

@CMMaung:將其分解成更小的部分。首先檢查'temp'是否有任何東西。如果是這樣,請檢查'result'的子查詢是否有數據,等等。如果不是,那麼檢查'temp'的子查詢是否返回任何東西。 –

+1

@CMMaung:我剛剛在原始查詢中意識到錯字。在'EmployeeID'上匹配'temp'的子查詢應該在'DepartmentCode'上匹配。我修復它並添加了一個可能的改進。 –

1

在極端情況下,你可以做到這一點:

using (var context = new ConnectDb())  
    { 
     context.ExecuteStoreCommand("your query"); 
     // for exaple: context.ExecuteStoreCommand("TRUNCATE TABLE Peoples"); 
     context.SaveChanges(); 
    } 
+0

答案中沒有LINQ。這不是OP正在尋找的東西。 – Steven

+0

@ Rim4irok感謝您的信息。看起來像解決方案之一:D – CMMaung