我有一个查询数据库的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查询中工作正常。感谢您抽出宝贵时间提供帮助。
答案 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
部分如此简单,最终我获得的收益很少。