2010-01-08 1 views
1

Мы медленно конвертируем некоторый код из VB.Net в C#, поэтому я пытаюсь изучить правильный синтаксис на C#. Может ли кто-нибудь помочь в этом преобразовании? В основном я вытягиваю из представления все значения, которые еще не были выбраны (сохранены) в другой таблице и выполняют поиск по элементам.Linq - конвертировать VB.Net в C# help по запросу

Сотрудники 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) }; 

Бита Я не уверен, что это Select части в VB - я угадывания, что он автоматически создает новый анонимный type (как и запрос 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

+0

Спасибо за ответ. Это действительно помогает мне с другими вопросами, которые у меня были. Теперь, чтобы купить книгу на C# LINQ :) – sugarcrum

Смежные вопросы