System.NotSupportedException已编译的LINQ查询

时间:2016-08-12 04:57:46

标签: c# linq

我有一个查询数据库的LINQ查询(我正在使用LINQ to SQL)。该查询可以单独使用,但是当我将它放入编译查询时,我在调用它时会收到错误。

错误,

  

抛出异常:'System.NotSupportedException'   System.Data.Linq.dll其他信息:成员   'StaffManager.Employee.Key'没有转换为SQL   支撑。

这是我一直在使用和查询的查询。

    public static ObservableCollection<Employee> EmployeesInSection(DatabaseDataContext database, string section)
    {
        return new ObservableCollection<Employee>(database.Staff_Time_TBLs
            .Where(staff => staff.Section_Data == section)
            .Select(staff => new Employee(staff.Staff_No ?? -1,
                staff.Staff_Name_First, staff.Staff_Name_Second))
            .ToList()
            .GroupBy(staff => staff.Key)
            .Select(staff => staff.First())
            .OrderBy(staff => staff.Key)
            .ToList());
    }

Employee class Key似乎给出了问题。

public class Employee
    {
        public int Key { get; set; }
        public string FirstName { get; set; }
        public string SecondName { get; set; }
        public string FullName => FirstName + " " + SecondName;

        public Employee(int key, string first = null, string second = null)
        {
            Key = key;
            FirstName = first;
            SecondName = second;
        }
    }  

这是编译的查询和调用查询的方法

public static class CompiledQueries
    {
        public static Func<DatabaseDataContext, string, IEnumerable<Employee>>        
            sectionEmployess = CompiledQuery.Compile((DatabaseDataContext database, string section) =>
                                 database.Staff_Data_TBLs.Where(staff => staff.Section_Data == section)
                                 .Select(staff => new Employee(staff.Staff_No ?? -1,
                                  staff.Staff_Name_First, staff.Staff_Name_Second))
                                 .ToList()
                                 .GroupBy(staff => staff.Key)
                                 .Select(staff => staff.First())
                                 .OrderBy(staff => staff.Key));                                     

}

方法,这里发生错误。

public static ObservableCollection<Employee> EmployeesInSection(DatabaseDataContext database, string section)
        {
            return new ObservableCollection<Employee>
                 (CompiledQueries.sectionEmployess(database, section));
        }

我不知道为什么这在编译的查询中不起作用,但在一个简单的LINQ查询中工作正常。感谢您抽出宝贵时间提供帮助。

1 个答案:

答案 0 :(得分:1)

对此的答案是,我试图在CompiledQuery类上使用它无法使用的东西。 LINQ只能在涉及SQL时使用此类,并且下面的查询的这部分不是。

.Select(staff => new Employee(staff.Staff_No ?? -1,
                    staff.Staff_Name_First, staff.Staff_Name_Second))
                .ToList()
                .GroupBy(staff => staff.Key)
                .Select(staff => staff.First())
                .OrderBy(staff => staff.Key)
                .ToList());

因此,为了使这项工作,第一部分被放入编译查询,

public static class CompiledQueries
    {
        public static Func<DatabaseDataContext, string, IQueryable<Staff_Time_TBL>>
             sectionEmployess = CompiledQuery.Compile((DatabaseDataContext database, string section) =>
                  database.Staff_Time_TBLs.Where(staff => staff.Section_Data == section));
    }

在方法中调用已编译的查询,并将LINQ的第二部分集成到该方法中。

对于任何感兴趣的人,最初我认为这是一个足够复杂的查询,可以保证尝试CompiledQuery,最终目标是提高应用程序的性能。然而,由于CompiledQuery部分如此简单,最终我获得的收益很少。