2009-10-07 9 views
1

J'ai la méthode LINQ ci-dessous qui est appelée à partir d'un User Control et déversée directement à un DataGridView standard. Mes utilisateurs veulent le tri par défaut, d'abord, par DisenrollmentDate puis Member Name. En ce moment, avec le code ci-dessous, il trie par DisenrollmentDate SEULEMENT.Tri multiple sur la méthode LINQ (imbriquée)


BLLCmo.cs

public static DataTable GetAllMembers(Guid workerID) 
    { 
     var AllEnrollees = from enrollment in context.tblCMOEnrollments 
           where enrollment.CMOSocialWorkerID == workerID || enrollment.CMONurseID == workerID 
           join supportWorker in context.tblSupportWorkers on enrollment.EconomicSupportWorkerID equals supportWorker.SupportWorkerID into workerGroup 
           from worker in workerGroup.DefaultIfEmpty() 
           orderby enrollment.DisenrollmentDate ascending 
           select new 
             { 
              enrollment.ClientID, 
              MemberName = BLLConnect.MemberName(enrollment.ClientID), 
              NurseName = BLLAspnetdb.NurseName(enrollment.CMONurseID), 
              SocialWorkerName =BLLAspnetdb.SocialWorkerName(enrollment.CMOSocialWorkerID), 
              enrollment.DisenrollmentDate, 
              enrollment.EnrollmentDate, 
              ESFirstName = worker.FirstName, 
              ESLastName = worker.LastName, 
              ESPhone = worker.Phone 
             }; 

     var dataTable = AllEnrollees.CopyLinqToDataTable(); 

     return dataTable; 
    } 

BLLConnect.cs

public static String MemberName(Int32 personID) 
    { 
     var memberName = from person in context.tblPersons 
         where person.PersonID == personID 
         orderby person.LastName ascending 
         select person.FirstName + " " + person.LastName; 

     return memberName.SingleOrDefault(); 
    } 

Répondre

2

Vous pouvez ajouter des clauses de commande dans votre déclaration orderby, séparés par une virgule.

public static DataTable GetAllMembers(Guid workerID) 
    { 
     var AllEnrollees = from enrollment in context.tblCMOEnrollments 
           where enrollment.CMOSocialWorkerID == workerID || enrollment.CMONurseID == workerID 
           join supportWorker in context.tblSupportWorkers on enrollment.EconomicSupportWorkerID equals supportWorker.SupportWorkerID into workerGroup 
           from worker in workerGroup.DefaultIfEmpty() 
           let memberName = BLLConnect.MemberName(enrollment.ClientID) 
           orderby enrollment.DisenrollmentDate ascending, memberName ascending 
           select new 
             { 
              enrollment.ClientID, 
              MemberName = memberName, 
              NurseName = BLLAspnetdb.NurseName(enrollment.CMONurseID), 
              SocialWorkerName =BLLAspnetdb.SocialWorkerName(enrollment.CMOSocialWorkerID), 
              enrollment.DisenrollmentDate, 
              enrollment.EnrollmentDate, 
              ESFirstName = worker.FirstName, 
              ESLastName = worker.LastName, 
              ESPhone = worker.Phone 
             }; 

     var dataTable = AllEnrollees.CopyLinqToDataTable(); 

     return dataTable; 
    } 

Notez que j'ai utilisé le mot-clé let pour extraire le memberName une fois, puis l'utiliser aussi bien pour la commande et la valeur de retour.

+0

Cela semble fonctionner. Merci!!! Malheureusement, il lance une exception sur la partie 'CopyLinqToDataTable' pour moi ... Je devrais juste utiliser' DataTables': \ –

+0

Peu importe ce que je fais, quand je vais assigner les résultats à la DataSource de DataGridView, il lance cette exception- -> 'System 'System.String MemberName (Int32)' n'a pas de traduction prise en charge vers SQL. ' –

+0

Oui, mais c'est un problème différent. Fondamentalement, il vous indique qu'il ne peut pas traduire l'arbre d'expression qui contient un appel de méthode dans T-SQL. Essayez d'intégrer cette expression dans la requête. –