1

これが重複した質問である場合は申し訳ありません。同様の質問をいくつか見つけましたが、問題を解決するものは見つかりませんでした。さまざまなパラメーターを持つオブジェクトのコレクションがあり、ComboBoxes と TextBoxes からのデータを使用してそれらをフィルター処理したいと考えています。

        var query = from zaj in zajezdy
                    where zaj.Zeme == (String)zemeCombo.SelectedValue
                    && zaj.Oblast == (String)oblastCombo.SelectedValue
                    && zaj.Stredisko == (String)strediskoCombo.SelectedValue
                    && zaj.Doprava.Contains((String)dopravaCombo.SelectedValue)
                    && zaj.Strava.Contains((String)stravaCombo.SelectedValue)
                    && zaj.CenaOd > Int32.Parse(cenaOdText.Text)
                    && zaj.CenaOd < Int32.Parse(cenaDoText.Text)
                    select zaj;

このコードは、すべてのコンボが適切に選択されている場合に機能します。ただし、ユーザーが選択されていない/空のままになっている場合、クエリはオブジェクトが含まれていない状態で返されます。クエリがそれらを無視するように、どのパラメーターが null であるかを検出するにはどうすればよいですか?

4

3 に答える 3

3

これは、 Specificationの使い方の良い例だと思います。

zajezd仕様を表すオブジェクトを作成します。

public interface ISpecification<T>
{
    bool IsSatisfiedBy(T value);
}

public class ZajezdSpecification : ISpecification<Zajezd>
{
    private string _zeme;
    private string _oblast;
    private string _stredisko;
    private string _doprava;
    private string _strava;
    private int _cenaOd;
    private int _cenaDo;

    public ZajezdSpecification(string zeme, string oblast, string stredisko, 
        string doprava, string strava, int cenaOd, int cenaDo)
    {
        _zeme = zeme;
        _oblast = oblast;
        _stredisko = stredisko;
        _doprava = doprava;
        _strava = strava;
        _cenaOd = cenaOd;
        _cenaDo = cenaDo;
    }

    public bool IsSatisfiedBy(Zajezd zajezd)
    {
        if (!String.IsNullOrEmpty(_zeme) && zajezd.Zeme != _zeme)
            return false;

        if (!String.IsNullOrEmpty(_oblast) && zajezd.Oblast != _oblast)
            return false;

        // ... verify anything you want

        return _cenaOd < zajezd.CenaOd && zajezd.CenaOd < _cenaDo;
    }
}

UI からの値で初期化します。

ZajezdSpecification spec = new ZajezdSpecification(
   (string)zemeCombo.SelectedValue,
   (string)oblastCombo.SelectedValue,
   (string)strediskoCombo.SelectedValue,
   ...
   Int32.Parse(cenaDoText.Text)
);

この仕様を使用して、コレクションをフィルタリングします。

var query = from zaj in zajezdy
            where spec.IsSatisfiedBy(zaj)
            select zaj;

PS コードでは英語名を使用するようにしてください。

于 2012-06-09T14:19:47.383 に答える
0

まず、コンボ\テキストごとに個別の変数を導入して使用してみてください。String.IsNullOrEmpty を使用して文字列をチェックします。また、Type.Parse() を避けるようにしてください - 代わりに Type.TryParse() を使用してください。サンプル :

 var query = from c in dc.Customers select c;
 //filter the result set based on user inputs
 if ( !string.IsNullOrEmpty( countryFilter ) )
   query = query.Where ( c=>c.Country == countryFilter );
 if ( !string.IsNullOrEmpty( cityFilter ) )
   query = query.Where ( c=>c.City == cityFilter );
于 2012-06-09T13:21:08.263 に答える