在MongoDB linq查询中使用OR运算符的意外行为

时间:2013-07-18 11:04:40

标签: linq mongodb mongodb-.net-driver mongodb-query

我正在创建一个linq查询来搜索MongoDB集合。

我有一个布尔值,它应该决定日期条件是否应用于查询。

查询看起来像这样:

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

请注意,上面的查询已经过简化,仅用于说明这一点。

问题是,它总是应用日期过滤,即使applyDateFilter是false,我真的不明白为什么会这样。

我目前正在使用MongoDB v2.0.6 - 我正准备尝试升级到更新的版本。

我在这里遗漏了什么吗? MongoDB linq documentation包括能够使用OR运算符和布尔常量的细节,所以我真的看不到这里发生了什么......

任何帮助都非常感激。

1 个答案:

答案 0 :(得分:0)

到目前为止,我还没有设法找出发生这种情况的原因,所以我沿着@innoSPG建议的路线应用标准并相应地构建查询。

我首先尝试使用PredicateBuilder,但我无法使用它来使用MongoDB。

所以最后我通过在查询数据库之前根据我的标准声明表达式来动态构建查询。然后我在linq查询的where子句中应用这些表达式。这是一些代码:

        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);

这不是世界上最好的代码,但你明白了: - )