2016-08-12 3 views
1

私はLINQクエリを使用してデータベースをクエリします(LINQ to SQLを使用しています)。クエリはスタンドアロンとしてうまく動作しますが、コンパイルされたクエリに挿入すると、呼び出し時にエラーが発生します。System.NotSupportedExceptionコンパイル済みLINQクエリ

エラー、スロー

例外: System.Data.Linq.dll追加情報の 'System.NotSupportedException':メンバー あるSQLへの変換は 'StaffManager.Employee.Key' はありません がサポートされています。

これは私が使用しているWORKSのクエリです。

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

これはKeyは問題を与えているようだEmployee classです。

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

クエリをリストに変換しました。これはもはやコンパイル可能なクエリではありません。 –

+0

@JeffMercado、あなたはこの '.ToList()'について話していますか? – KyloRen

+0

@JeffMercado、まったく同じランタイムエラーが発生しています。 – KyloRen

答えて

1

これは私がCompiledQueryクラスを使用できないものに使用しようとしていたことによるものです。 LINQは、SQLが関与している場合にのみこのクラスを使用でき、以下のクエリのこの部分は使用できません。この方法でコンパイルされたクエリを呼び出し、そのにLINQの第二部を統合したよりだから、この仕事をするために、最初の部分がコンパイルされたクエリに入れて

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

方法。

興味のある当初、これはアプリケーションのパフォーマンスを向上させるという究極の目的で、CompiledQueryを試してみるのに十分な複雑なクエリだと私は思っていました。しかし、最終的にはCompiledQueryの部分がとてもシンプルになったため、ほとんど得られませんでした。

関連する問題