0

EF および Linq メソッド構文を使用してデータベースからデータを取得するメソッドを実装しようとしています。このメソッドには 5 つのパラメーター (4 つのリストと 1 つの文字列) があり、各パラメーターはクエリ結果のフィルターとして機能する必要があります。

「Where」メソッド内での三項演算子の使用は、次のコードの一部の式 (1 ~ 4) で機能しますが、式 (5) では、「nameFilter」の文字列値に関係なく、三項演算子を使用して Where 条件が完全に無視されます。式(5)の式(5)は無視されますが!nameFilter.Equals("")、nameFilterの値が""の場合に条件結果が真になることをデバッグ時に確認しました。

public IEnumerable<UNIDADE> RecuperarPorEmpresaEstadoCITYTipoUnidadeFiltroNAME( List<int> companiesId, List<int> statesId, List<int> citiesId, List<int> typesId, string nameFilter ) 
{
    return base.Dataset
            .Where( u => companiesId.Count() > 0 ? companiesId.Contains( u.COMPANY_ID ) : true ) //1
            .Where( u => statesId.Count() > 0 ?  statesId.Contains( u.CITY.STATE_ID ) : true ) //2
            .Where( u => citiesId.Count() > 0 ?  citiesId.Contains( u.CITY_ID ) : true ) //3
            .Where( u => typesId.Count() > 0 ? typesId.Contains( u.TYPE_ID ) : true ) //4
            .Where( u => !nameFilter.Equals("") ? u.NAME.ToUpper().Contains( nameFilter.ToUpper() ) : true ); //5
}

最後に、問題を解決しようとして、表現を変更しました.Where( u => !nameFilter.Equals("") ? u.NAME.ToUpper().Contains( nameFilter.ToUpper() ) : true );

.Where( u => nameFilter.Length > 0 ? u.NAME.ToUpper().Contains( nameFilter.ToUpper() ) : true )

そしてそれはうまくいきました。

私は C# と Entity Framework を初めて使用するので、文字列と比較すると、「長さ」と比較して三項演算子が何らかの形で無視され、期待される結果が得られた理由を理解したいと思います。Entity Framework でこのクエリを実行する別の方法はありますか?

前もって感謝します。

4

0 に答える 0