2009-10-07 48 views
2

這是從這裏開始的後續工作 - >multiple-sorting-on-linq-nested-method嵌套的LINQ方法拋出`不支持...`異常

基本上,在let memberName = ...它拋出這個異常Method 'System.String MemberName(Int32)' has no supported translation to SQL.,我沒有找出解決方案。

此外,BLLCmoBLLConnect實際使用兩個不同數據庫間。原來的應用程序(不是我的)使用4個獨立的數據庫的,所以我試圖做出應有的。


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

BLLConnect.cs

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

     return memberName.SingleOrDefault(); 
    } 
+0

沒有什麼不妥表明您已經試過那並不是什麼沒有工作。它可以節省我們所有的時間,並且/或者我們可能知道使「近乎工作」的版本變成「正常工作」的缺失的魔術字。 – 2009-10-07 21:04:35

+0

我會牢記這一點。謝謝馬克 – 2009-10-07 21:05:52

回答

4

的問題是,LINQ to SQL的試圖您的方法轉換成SQL。由於MemberName是無效的SQL,因此放棄。相反,你需要拉下你從SQL需要的數據,然後打電話給你在一個單獨的LINQ方法(和排序)到對象查詢:

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() 
     select new 
     { 
      enrollment.ClientID, 
      enrollment.CMONurseID, 
      enrollment.CMOSocialWorkerID, 
      enrollment.DisenrollmentDate, 
      enrollment.EnrollmentDate, 
      ESFirstName = worker.FirstName, 
      ESLastName = worker.LastName, 
      ESPhone = worker.Phone 
     }; 

    var result = 
     from enrollee in AllEnrollees.AsEnumerable() 
     let memberName = BLLConnect.MemberName(enrollee.ClientID) 
     orderby enrollee.DisenrollmentDate ascending, memberName ascending 
     select new 
     { 
      enrollee.ClientID, 
      MemberName = memberName, 
      NurseName = BLLAspnetdb.NurseName(enrollee.CMONurseID), 
      SocialWorkerName = BLLAspnetdb.SocialWorkerName(enrollee.CMOSocialWorkerID), 
      enrollee.DisenrollmentDate, 
      enrollee.EnrollmentDate, 
      enrollee.ESFirstName, 
      enrollee.ESLastName, 
      enrollee.ESPhone 
     }; 

    return result.CopyLinqToDataTable(); 
} 
+0

這是那些如此簡單,如此好的解決方案之一,我覺得自己沒有到達那裏是愚蠢的。它很棒! – 2009-10-08 12:47:46

相關問題