これまでのところ、なぜこれが起こったのかを突き止めることができなかったので、条件を適用してそれに応じてクエリを作成する @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);
世界で最も素晴らしいコードではありませんが、アイデアはわかります:-)