2010-01-08 86 views
1

我們正在慢慢地將一些VB.Net代碼轉換爲C#,所以我試圖在C#中學習正確的語法。有人可以幫助完成此轉換嗎?基本上,我從一個視圖中拖出所有尚未在另一個表中選擇(保存)的值並對這些項目進行搜索。Linq - 通過查詢將VB.Net轉換爲C#幫助

員工a,b,c,d位於Employee表中。 我已經選擇並保存員工a和b。 現在,當我重新運行搜索時,它應該排除員工a和b,並且只有在滿足搜索條件時才搜索c和d。

這適用於vb.net查詢。我試圖弄清楚如何翻譯。

感謝您的幫助!我認爲這是一個非常簡單的翻譯,我只是遇到了一些麻煩。

Dim query = From tmp In context.vw_EmployeeDemographics _ 
    Where Not (From jitrv In context.JITRuleValidations 
    Join e In context.Employees On jitrv.Employee_RecordID Equals e.RecordID _ 
    Where jitrv.Parent_RecordID = Parent_RecordID _ 
    Select e.RecordID).Contains(tmp.Parent_RecordID) And 
    context.fn_ConcatName(tmp.FirstName, tmp.MiddleName, 
     tmp.LastName).Contains(_master.pSearchValue1) _ 
     Order By tmp.LastName.ToUpper(), tmp.FirstName.ToUpper() _ 
    Select FirstName = tmp.FirstName, MiddleName = tmp.MiddleName, 
    LastName = tmp.LastName, RecordID = tmp.EmployeeID, _ 
DisplayText = context.fn_ConcatName(tmp.FirstName, tmp.MiddleName, tmp.LastName) 

回答

2

好吧,作爲一個逐字轉換:

var query = from tmp in context.vw_EmployeeDemographics 
      where !(from jitrv in context.JITRuleValidations 
        join e in context.Employees 
        on jitrv.Employee_RecordID equals e.RecordID 
        where jitrv.Parent_RecordID == Parent_RecordID 
        select e.RecordID).Contains(tmp.Parent_RecordID) 
        && context.fn_ConcatName(tmp.FirstName, tmp.MiddleName, tmp.LastName) 
          .Contains(_master.pSearchValue1) 
      orderby tmp.LastName.ToUpper(), tmp.FirstName.ToUpper() 
      select new { tmp.FirstName, tmp.MiddleName, tmp.LastName, 
         RecordID = tmp.EmployeeID, 
         DisplayText = context.fn_ConcatName(tmp.FirstName, 
                tmp.MiddleName, tmp.LastName) }; 

我不知道的是在VB中Select部分位 - 我猜,它會自動創建一個新的匿名類型(就像C#查詢一樣),但我不確定。

我認爲應該這樣做 - 但我強烈建議您重構它到更多的東西可讀:)這裏有幾個變化:

var validations = from jitrv in context.JITRuleValidations 
        join e in context.Employees 
        on jitrv.Employee_RecordID equals e.RecordID 
        where jitrv.Parent_RecordID == Parent_RecordID 
        select e.RecordID; 

var query = from tmp in context.vw_EmployeeDemographics 
      let DisplayText = fn_ConcatName(tmp.FirstName, 
              tmp.MiddleName, 
              tmp.LastName) 
      where !validations.Contains(tmp.Parent_RecordID) 
       && DisplayText.Contains(_master.pSearchValue1) 
      orderby tmp.LastName.ToUpper(), tmp.FirstName.ToUpper() 
      select new { tmp.FirstName, tmp.MiddleName, tmp.LastName, 
         RecordID = tmp.EmployeeID, DisplayText }; 
+1

您也可以拆分兩個條件爲單獨「何處「條款。即其中!validations.Contains(tmp.Parent_RecordID)其中DisplayText.Contains(_master.pSearchValue1) 我喜歡這樣做,只要條款彼此不相關 - 使它更乾淨,更可讀,恕我直言。 – GalacticCowboy 2010-01-08 14:58:29

+0

感謝您的回覆。這實際上幫助了我很多其他的問題。現在,在C#LINQ上購買一本書:) – sugarcrum 2010-01-08 15:02:40