【问题标题】:Linq - Convert VB.Net to C# help with on queryLinq - 将 VB.Net 转换为 C# 帮助进行查询
【发布时间】:2010-01-08 14:35:49
【问题描述】:

我们正在慢慢地将一些代码从 VB.Net 转换为 C#,因此我正在尝试学习 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)

【问题讨论】:

    标签: linq-to-sql vb.net-to-c#


    【解决方案1】:

    好的,作为逐字转换:

    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”子句。即 where !validations.Contains(tmp.Parent_RecordID) where DisplayText.Contains(_master.pSearchValue1) 我喜欢在子句彼此不相关时执行此操作 - 恕我直言,使其更清晰、更具可读性。
    • 感谢您的回复。这实际上对我遇到的其他一些问题很有帮助。现在,继续购买有关 C# LINQ 的书 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多