Вложенный метод LINQ, выдающий исключение «Не поддерживается»

Это продолжение отсюда -->multiple-sorting-on-linq-nested- метод .

По сути, на let memberName = ... выдается это исключение Method 'System.String MemberName(Int32)' has no supported translation to SQL., и я не нахожу решения.

Кроме того, BLLCmo и BLLConnect на самом деле используют ДВЕ разные базы данных. Исходное приложение (не мое) использует 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();
    }

person Refracted Paladin    schedule 07.10.2009    source источник
comment
Нет ничего плохого в том, чтобы указать, что вы пробовали, но это не работает. Это может сэкономить нам всем время, и/или мы можем узнать недостающие волшебные слова, которые превращают почти рабочую версию в рабочую.   -  person Marc Gravell    schedule 08.10.2009
comment
Я запомню это. Спасибо Марк   -  person Refracted Paladin    schedule 08.10.2009


Ответы (1)


Проблема в том, что LINQ to SQL пытается перевести ваш метод в SQL. Поскольку MemberName не является допустимым SQL, он сдается. Вместо этого вам нужно будет извлечь нужные данные из SQL, а затем вызвать свои методы (и отсортировать) в отдельном запросе LINQ to Objects:

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();
}
person dahlbyk    schedule 07.10.2009
comment
Это одно из тех решений, которые настолько просты и так хороши, что я чувствую себя глупо из-за того, что не дошел до этого самостоятельно. Это прекрасно работает! - person Refracted Paladin; 08.10.2009