1

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

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

查询看起来像这样:

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 一起使用。

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

        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 回答