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 でこのクエリを実行する別の方法はありますか?
前もって感謝します。