2017-01-24 16 views
2

私は現在、以下のエラーに種類の例外System.NotSupportedException - タイプの要素を比較することはできません「System.Linq.IQueryable

を取得していますが 『System.NotSupportedException』> EntityFramework.SqlServer.dllで発生したが、でしたユーザーコードで処理されない

追加情報: 'System.Linq.IQueryable`1 [System.Int32、mscorlib、Version = 4.0.0.0、> Culture =ニュートラル、PublicKeyToken = b77a5c561934e089]]の要素を比較できません' 。プリミティブ型、>列挙型およびエンティティ型のみがサポートされています。

私のコードは、クエリが完全に実行し、

public List<User> GetActiveUsers(IEnumerable<int> officeIDs, string roleID, string query) 
{ 
    return (from user in GetDBContext.User 
      join userRole in GetDBContext.UserRole 
       on user.UserID equals userRole.UserID 
      join userOffice in GetDBContext.UserAuthorizedOffice 
       on user.UserID equals userOffice.UserID 
      where user.IsActive == true && 
        user.UserTypeID == 1 && 
        userOffice.IsAuthorized && 
        userOffice.Office.IsActive && 
        (officeIDs == null || officeIDs.Contains(userOffice.OfficeID)) && 
        string.Equals(userRole.RoleID, roleID) && 
        (user.FirstName + user.LastName).Contains(query) 
      select user).ToList(); 
} 

問題は、私が最初の条件、officeIDs == nullを削除した場合のライン

(officeIDs == null || officeIDs.Contains(userOffice.OfficeID))

から投げているように見えるです。

誰かが私が逃していること、またはこのエラーがなぜ投げられたのか説明してください。

答えて

5

officeIDs == null以下の変更 sqlステートメントにcovertedすることはできません。

(officeIDs == null || officeIDs.Contains(userOffice.OfficeID)) 
それはあなたの関数の先頭にヌルかどう

最初のチェック:

officeIDs = officeIDs ?? Enumerable.Empty<int>; 

と交換そのクエリの場合:

(!officeIDs.Any() || officeIDs.Any(id => id == userOffice.OfficeID)) 
1

officeIDs == nullは、linqの一部ではないステートメントです(データベースクエリにマッピングできない(クエリではありません))。

officeIDがnullでないことを確認し、linqクエリから削除します。

public List<User> GetActiveUsers(IEnumerable<int> officeIDs, string roleID, string query) 
    { 
     officeIDs = officeIDs ?? new List<int>(); 

     return (from user in GetDBContext.User 
       join userRole in GetDBContext.UserRole 
        on user.UserID equals userRole.UserID 
       join userOffice in GetDBContext.UserAuthorizedOffice 
        on user.UserID equals userOffice.UserID 
       where user.IsActive == true && 
         user.UserTypeID == 1 && 
         userOffice.IsAuthorized && 
         userOffice.Office.IsActive && 
         officeIDs.Contains(userOffice.OfficeID) && 
         string.Equals(userRole.RoleID, roleID) && 
         (user.FirstName + user.LastName).Contains(query) 
       select user).ToList(); 
    } 
+1

nullの場合は何も返されません。代わりに 'query = from ........'(ToListなし)を実行し、 'officeIDsがnullでない場合{query.Where ....} return query' –

関連する問題