Linq to sql Linq-将VB.Net转换为C#关于查询的帮助

Linq to sql Linq-将VB.Net转换为C#关于查询的帮助,linq-to-sql,vb.net-to-c#,Linq To Sql,Vb.net To C#,我们正在慢慢地将一些代码从VB.Net转换为C#,因此我正在尝试学习C#中的正确语法。有人能帮我转换一下吗?基本上,我从一个视图中提取所有尚未在另一个表中选择(保存)的值,并对这些项进行搜索 员工a、b、c、d在员工表中。 我已经选择并保存了员工a和b。 现在,当我重新运行搜索时,它应该排除员工a和b,并且仅在满足搜索条件的情况下搜索c和d 这在vb.net查询中运行良好。我在想怎么翻译 谢谢你的帮助!我认为这是一个非常简单的翻译,我只是有点麻烦 Dim query = From tmp In

我们正在慢慢地将一些代码从VB.Net转换为C#,因此我正在尝试学习C#中的正确语法。有人能帮我转换一下吗?基本上,我从一个视图中提取所有尚未在另一个表中选择(保存)的值,并对这些项进行搜索

员工a、b、c、d在员工表中。 我已经选择并保存了员工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)

好的,作为逐字转换:

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 };

您还可以将这两个条件拆分为单独的“where”子句。i、 在哪里!validations.Contains(tmp.Parent\u RecordID)其中DisplayText.Contains(\u master.pSearchValue1)每当子句彼此不相关时,我都喜欢这样做-使它更干净、更可读,IMHO。感谢您的回复。这实际上对我提出的其他一些问题有很大帮助。现在,我们来买一本关于C#LINQ:)的书