1

MongoDB コレクションを検索するための linq クエリを作成しています。

日付基準がクエリに適用されるかどうかを決定するブール値があります。

クエリは次のようになります。

var matches = collection
.AsQueryable<Event>()
.Where(x => ((!applyDateFilter) || (x.CreatedDate >= startDate && x.CreatedDate < endDate)));

上記のクエリは、要点のみを説明するために単純化されていることに注意してください。

問題は、 applyDateFilter が であっても、常に日付フィルタリングを適用しているfalseことです。これがなぜなのか、私には本当にわかりません。

現在、MongoDB v2.0.6 を使用しています。新しいバージョンにアップグレードしようとしています。

ここで何か不足していますか?MongoDB linqのドキュメントには、OR 演算子とブール定数を使用できることの詳細が含まれているため、ここで何が起こっているのか本当にわかりません...

どんな助けでも大歓迎です。

4

1 に答える 1

0

これまでのところ、なぜこれが起こったのかを突き止めることができなかったので、条件を適用してそれに応じてクエリを作成する @innoSPG によって提案されたルートをたどりました。

最初に PredicateBuilder を使用しようとしましたが、これを MongoDB で動作させることができませんでした。

そのため、最終的には、データベースにクエリを実行する前に、自分の基準に基づいて式を宣言することでクエリを動的に構築しました。次に、これらの式をwherelinq クエリの句に適用します。ここにいくつかのコードがあります:

        IEnumerable<Event> matches;
        Expression<Func<Event, bool>> searchQuery;
        Expression<Func<Event, bool>> dateQuery;

        switch (_searchColumn)
        {
            case "username":
                searchQuery = (x) => x.UserFullName.Contains(_searchQuery) || x.UserEmailAddress.Contains(_searchQuery);
                break;
            case "eventtype":
                searchQuery = (x) => x.Type.In(_eventTypes);
                break;
            default:
                searchQuery = (x) => true;
                break;
        }

        if (applyDateFilter)
        {
            var date = Convert.ToDateTime(_datefilter);
            DateTime startDate = date.Date;
            DateTime endDate = date.AddDays(1).Date;

            dateQuery = (x) => (x.Id >= startDate.ToObjectId() && x.Id < endDate.ToObjectId());
        }
        else
        {
            dateQuery = (x) => true;
        }

            matches = collection
                .AsQueryable<Event>()
                .Where(searchQuery)
                .Where(dateQuery)
                .OrderByDescending((x) => x.Id);

世界で最も素晴らしいコードではありませんが、アイデアはわかります:-)

于 2013-07-23T08:34:15.273 に答える