2017-01-24 5 views
0

質問は、私が以前にこの方法では、のように動作します上記の問題の方法はヌルチェックが

public List<User> GetActiveUsers(int? officeID, 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 && 
        (userOffice.OfficeID == officeID || officeID == null) && 
        string.Equals(userRole.RoleID, roleID) && 
        (user.FirstName + user.LastName).Contains(query) 
      select user).ToList(); 
} 

の下から変更された答えhttps://stackoverflow.com/a/41822351/2004251

と答えたSystem.NotSupportedException - Cannot compare elements of type 'System.Linq.IQueryable

を尋ねました期待される。

私の質問:nullチェックはこの方法で動作するかどうかの入力パラメータが最初のケースではIEnumerable<int>

+0

私はSQLの専門家ではないんだけど、これは私の推測です。この例では、1つの 'int? '値がNULLに等しいかどうかを確認しています。これはSQLに相当します。参照される質問では、コレクション全体がNULLであるかどうかをチェックしていますが、これはSQL文に変換するのが簡単ではありません。 – Abion47

+0

_inputパラメータ_が「IEnumerable 」、officeIDに変更されていますか?それはまったく異なるクエリです。 –

+0

@TimSchmelterはい、 'int? officeID'が「IEnumerable officeIDs」に変更されました – gvk

答えて

0

に変換されたときに、なぜそれがあなたのタイプはSQLで任意の同等を持っていませんIEnumerableでは動作しません。 。

intデータ型の列とチェックは、ヌルを許可:が、第2のケースはSQLは、そのための正確な型を持つnull許容intことです。

だからofficeID == nullは、エンティティ・フレームワークによりSQL側で表現に変換することができるが、IEnumerableSQLによって認識することができるタイプではなく、一方、それの値は、メモリ内の参照です。 SQLで、アプリケーションメモリ内のポイントされた場所がヌルオブジェクトを指していないことをどのようにチェックしますか?

0

コレクションでは、代わりにContains()を使用します。これにより、officeIDがコレクションに含まれている場合にユーザーが返されます。

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.Contains(userOffice.Office) 
          string.Equals(userRole.RoleID, roleID) && 
          (user.FirstName + user.LastName).Contains(query) 
        select user).ToList(); 
    } 

次に、あなたがnullチェックと組み合わせると、その結果に応じて、異なるクエリを実行することができます

return officeIDs != null 
        ? (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.Office) 
           string.Equals(userRole.RoleID, roleID) && 
           (user.FirstName + user.LastName).Contains(query) 
         select user).ToList(); 
        : (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 && 
           string.Equals(userRole.RoleID, roleID) && 
           (user.FirstName + user.LastName).Contains(query) 
         select user).ToList(); 
関連する問題