2010-01-08 48 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