2010-01-08 14 views
1

Nous convertissons lentement du code de VB.Net en C#, donc j'essaie d'apprendre la syntaxe correcte en C#. Quelqu'un pourrait-il aider avec cette conversion? Fondamentalement, je tire d'une vue toutes les valeurs qui n'ont pas déjà été sélectionnées (enregistrées) dans une autre table et faire une recherche sur les éléments.Linq - Convertir VB.Net en aide C# avec

Les employés a, b, c, d sont dans la table Employé. J'ai déjà sélectionné et enregistré les employés a et b. Maintenant, lorsque je relance la recherche, elle doit exclure les employés a et b et ne rechercher que c et d si les critères de recherche sont remplis.

Cela fonctionne très bien dans la requête vb.net. J'essaie de comprendre comment traduire.

Merci pour toute aide! Je pense que c'est une traduction très simple, j'ai juste un peu de problème avec ça.

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) 

Répondre

2

D'accord, comme une conversion in extenso:

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

Le bit Je ne suis pas sûr de la partie est Select dans le VB - Je devine qu'il crée automatiquement un nouveau anonyme tapez (comme le fait la requête C#) mais je ne suis pas sûr.

Je pense qu'il faut le faire - mais je fortement vous recommandons de refactoring en quelque chose de plus lisible :) Voici quelques changements:

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

Vous pouvez également diviser les deux conditions dans séparés « où "clauses" c'est-à-dire où! validations.Contains (tmp.Parent_RecordID) où DisplayText.Contains (_master.pSearchValue1) J'aime faire cela chaque fois que les clauses ne sont pas liées les unes aux autres - le rend plus propre et plus lisible, à mon humble avis. – GalacticCowboy

+0

Merci pour la réponse. Cela m'aide beaucoup avec d'autres questions que j'avais. Maintenant, sur l'achat d'un livre sur C# LINQ :) – sugarcrum