【问题标题】:Nested LINQ Method throwing a `Not Supported...` Exception嵌套 LINQ 方法抛出“不支持...”异常
【发布时间】:2010-12-04 18:49:28
【问题描述】:

这是从这里开始的后续行动 -->multiple-sorting-on-linq-nested-method 。

基本上,在let memberName = ... 上,它会抛出此异常Method 'System.String MemberName(Int32)' has no supported translation to SQL.,而我没有找到解决方案。

另外,BLLCmo 和 BLLConnect 实际上使用了两个不同的DataBases。原始应用程序(不是我的)使用 4 个单独的 DB,所以我正在努力做到这一点。


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

【问题讨论】:

  • 指出您尝试过但不起作用的方法并没有错。它可以为我们节省一些时间,和/或我们可能知道使“几乎可以工作”版本变成“工作”的缺少的魔法词。
  • 我会记住这一点。谢谢马克

标签: c# linq linq-to-sql exception let


【解决方案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();
}

【讨论】:

  • 这是一种非常简单和非常好的解决方案,以至于我觉得自己不去那里很愚蠢。效果很好!
猜你喜欢
  • 1970-01-01
  • 2018-06-15
  • 1970-01-01
  • 2020-02-15
  • 1970-01-01
  • 2020-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多